• activemq应用总结(一)


    1.mq发送消息准备

    配置

            <spring:bean id="jmsFactory"
                class="org.apache.activemq.ActiveMQConnectionFactory">
                <spring:property name="brokerURL" value="${activemq.brokerURL}" />
                <spring:property name="userName" value="${activemq.username}" />
                <spring:property name="password" value="${activemq.password}" />
            </spring:bean>
    
            <spring:bean id="client" class="com.*.*.core.mq.Client" init-method="init" destroy-method="destroy">
                <spring:property name="jmsFactory">
                    <spring:ref bean="jmsFactory" />
                </spring:property>
                <spring:property name="reqQueue">
                    <spring:ref bean="reqQueneOne" />
                </spring:property>
                <spring:property name="resQueue">
                    <spring:ref bean="resQueneOne" />
                </spring:property>
                <spring:property name="timeToLive" value="${activemq.timetolive}" />
                <spring:property name="hostName">
                    <spring:ref bean="hostInfo.hostName"/>
                </spring:property>
            </spring:bean>
    
            <spring:bean id="service" class="com.*.*.core.mq.AMQService">
                <spring:property name="client">
                    <spring:ref bean="client" />
                </spring:property>
                <spring:property name="readTime" value="${activemq.readtimeout}" />
            </spring:bean>

    mq通过jmsFactory产生的connection

    connection = jmsFactory.createConnection();

    connection通过获取会话session

    session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

    session产生producer.

    producer = session.createProducer(reqQueue);

    2.发送的消息体

    ActiveMQBytesMessage byteMessage = new ActiveMQBytesMessage();

    byteMessage设置JMSCorrelationID,Content(byteSequence = new ByteSequence(mqMessageEntity.getStrRecBuf().getBytes(MQGlobals.MQ_CHARSET));),property(name,value).JMSReplyTo(resQueue).

        public String send(MQMessageEntity mqMessageEntity)
        {
            String sRecBuf = mqMessageEntity.getStrRecBuf();
            String correlationID = String.valueOf(Thread.currentThread().getId())+"_"+createRandomString();
            ClientAMQ clientAMQ = new ClientAMQ();
            DataCache.instance().putData(correlationID, clientAMQ);
            mqMessageEntity.setCorrelationID(correlationID);
            client.sendMQ(mqMessageEntity);
            log.info("发送:correlationID="+correlationID+";["+sRecBuf+"]");
            String returnBuf = clientAMQ.waitRes(readTime);
            DataCache.instance().removeData(correlationID);
            //打印接收报文
            log.info("返回:correlationID="+correlationID+";["+returnBuf+"]");
            if (null == returnBuf) {
                returnBuf = "";
            }
            return returnBuf;
        }

    3.接收消息配置

            <spring:bean id="reqQueueOne"
                class="org.apache.activemq.command.ActiveMQQueue">
                <spring:constructor-arg value="${lianpay.reqQueueOne}"></spring:constructor-arg>
            </spring:bean>
            <spring:bean id="resQueueOne"
                class="org.apache.activemq.command.ActiveMQQueue">
                <spring:constructor-arg value="${lianpay.resQueueOne}"></spring:constructor-arg>
            </spring:bean>
            <!-- YT_RESP消息监听 -->
            <spring:bean id="msgListener"
                class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
                <spring:constructor-arg>
                    <spring:bean
                        class="com.*.*.core.mq.MsgListener">
                    </spring:bean>
                </spring:constructor-arg>
                <spring:property name="defaultListenerMethod" value="handleMessage" />
                <spring:property name="messageConverter" ref="messageConverter" />
            </spring:bean>
            <!-- 交易监听容器 -->
            <spring:bean id="YTMsgContainer"
                class="org.springframework.jms.listener.DefaultMessageListenerContainer">
                <spring:property name="concurrentConsumers" value="${activemq.consumers}" />
                <spring:property name="connectionFactory" ref="jmsFactory" />
                <spring:property name="destination" ref="resQueueOne" />
                <spring:property name="messageListener" ref="msgListener" />
                <spring:property name="messageSelector" value="${selector.resp}"/>
            </spring:bean>

    4.接收消息

        public void handleMessage(ActiveMQBytesMessage activeMQBytesMessage) {
            String correlationID = activeMQBytesMessage.getCorrelationId();
            log.info("监听到消息:correlationID=" + correlationID + "];"+ activeMQBytesMessage.getDestination());
            String returnBuf = null;
            try {
                returnBuf = new String(activeMQBytesMessage.getContent().getData(),MQGlobals.MQ_CHARSET);
            } catch (UnsupportedEncodingException e) {
                log.error("字符转换异常," + e.getMessage());
            }
            // 判断内存中是否存在发送对象
            Object obj = DataCache.instance().getData(correlationID);
            if (null != obj) {
                ClientAMQ clientAmq = (ClientAMQ) obj;
                clientAmq.setReturnBuf(returnBuf);
                clientAmq.startNotify(correlationID);
            } else {
                log.info("correlationID=" + correlationID + ";[" + returnBuf + "]");
            }
        }

    5,接受消息的消息体

    public class ClientAMQ {
        private String returnBuf;//返回结果
        
        /**
         * 开始等待
         * @param waitTine
         * @return
         */
        public synchronized String waitRes(long waitTime)
        {
            if(null!=returnBuf)
                return returnBuf;
            try {
                wait(waitTime);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return returnBuf;
        }
        
        /**
         * 开始唤醒
         * @param correlationID
         */
        public synchronized void startNotify(String correlationID)
        {
            notify();
        }
    
        public String getReturnBuf() {
            return returnBuf;
        }
    
        public void setReturnBuf(String returnBuf) {
            this.returnBuf = returnBuf;
        }
    }
  • 相关阅读:
    Erlang 督程 启动和结束子进程
    cocos2d-x 3.0 内存管理机制
    c语言基本数据类型
    4星|《剑桥中国经济史:古代到19世纪》:经济学视角看中国古代史
    孟晚舟三种结局;共享单车大败局;失业潮不会来:4星|《财经》2018年第30期
    2018左其盛差评榜,罕见的差书榜
    2018左其盛好书榜,没见过更好的榜单
    罗振宇时间的朋友2018跨年演讲中最重要的35句话
    中国土地制度与房价走势相关9本书
    2星|水木然《世界在变软》:肤浅的朋友圈鸡汤文
  • 原文地址:https://www.cnblogs.com/hzcxy/p/2982149.html
Copyright © 2020-2023  润新知