zoukankan      html  css  js  c++  java
  • ActiveMq 配置多队列

    一直在赶项目,好久没有写博文了,中间偶尔有些代码什么的,也都是放到github了,不过大多都是测试代码,毕竟有些成型的东西是给公司写的,鉴于职业道德,还是不好公开。

    言归正传,这两天在接入第三方的收费管理系统,后台有个扫描记录的,数据然后发送到我这里,然后我来处理。

    毕竟是走的restful的方式,说到底是比较多的http请求,他们不关心结果,只知道通信成功即可。于是,又用到了消息队列。前面用的是activemq,这里需要再配置一个队列。

    如果不整合spring,用原生的activemq代码来写的话,多个队列很容易实现。但是整合spring后,大多都是配置一个队列。琢磨了一下,这里配置了两个队列,其实就是一个配置文件。因为是测试,这样写的有点不雅观。

    配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    
        <!-- 消息中介-->
        <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
            <property name="brokerURL" value="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0"/>
            <property name="useAsyncSend" value="true" />
        </bean>
    
        <!-- 队列目的地-->
        <bean id="myQueueOne" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg index="0" value="QueueDemoOne"/>
        </bean>
        <bean id="myQueueTwo" class="org.apache.activemq.command.ActiveMQQueue">
            <constructor-arg index="0" value="QueueDemoTwo" />
        </bean>
    
        <bean id="jmsTemplateOne" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="connectionFactory"/>
            <!-- 设置默认的消息目的地-->
            <property name="defaultDestination" ref="myQueueOne"/>
            <property name="deliveryMode" value="1"></property>
            <!-- 消息不持久化 -->
            <property name="explicitQosEnabled" value="true"></property>
            <!-- 由于receiver方法是同步的,所以我们在这里对接收设置超时时间-->
            <!--  <property name="receiveTimeout" value="60000"/>   -->
        </bean>
        <bean id="jmsTemplateTwo" class="org.springframework.jms.core.JmsTemplate">
            <property name="connectionFactory" ref="connectionFactory"/>
            <!-- 设置默认的消息目的地-->
            <property name="defaultDestination" ref="myQueueTwo"/>
            <property name="deliveryMode" value="1"></property>
            <!-- 消息不持久化 -->
            <property name="explicitQosEnabled" value="true"></property>
        </bean>
    
        <!-- 消息发送者-->
        <bean id="producer1" class="com.ww.topic.SenderOne">
            <property name="jmsTemplate" ref="jmsTemplateOne"/>
            <!-- 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略
            <property name="destination" ref=" myQueue "/>-->
        </bean>
        <bean id="producer2" class="com.ww.topic.SenderTwo">
            <property name="jmsTemplate" ref="jmsTemplateTwo"/>
            <!-- 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略
            <property name="destination" ref=" myQueue "/>-->
        </bean>
    
        <!-- 消息接收监听器用于异步接收消息-->
        <bean id="container1" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="connectionFactory" ref="connectionFactory"/>
            <property name="destination" ref="myQueueOne"/>
            <property name="messageListener" ref="jmsListenerOne"/>
        </bean>
        <bean id="container2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
            <property name="connectionFactory" ref="connectionFactory"/>
            <property name="destination" ref="myQueueTwo"/>
            <property name="messageListener" ref="jmsListenerTwo"/>
        </bean>
    
        <!-- 消息监听实现方法一 -->
        <bean id="jmsListenerOne" class="com.ww.topic.ListenerOne">
        </bean>
        <bean id="jmsListenerTwo" class="com.ww.topic.ListenerTwo">
        </bean>
    
    </beans>

    其实是配置了两个监听器,然后把各自的destination ,sender,listener配置了两个。

    测试代码:

    sender:

    package com.ww.topic;
    
    import org.junit.Test;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.core.MessageCreator;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.Session;
    import javax.jms.TextMessage;
    
    /**
     * Created by wang on 15-3-24.
     */
    public class SenderOne {
        private JmsTemplate jmsTemplate;
    
        public JmsTemplate getJmsTemplate() {
            return jmsTemplate;
        }
    
        public void setJmsTemplate(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
        }
    
        @Test
        public void sendQueue(){
            jmsTemplate.send(new MessageCreator() {
                @Override
                public Message createMessage(Session session) throws JMSException {
                    TextMessage message = session.createTextMessage();
                    message.setText("This is one sender");
                    return message;
                }
            });
        }
    }

    listener:

    package com.ww.topic;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    
    /**
     * Created by wang on 15-3-24.
     */
    public class ListenerOne implements MessageListener {
        @Override
        public void onMessage(Message message) {
            TextMessage msg = (TextMessage) message;
            try {
                System.out.println("REC: "+msg.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }

    第二个和第一个是同理的代码。

    源码下载:https://github.com/ThinkCats/Queue

  • 相关阅读:
    java技术用ssh从linux服务器下载数据
    linux 常见操作命令
    IP地址归属地查询
    【转】Java检测字符串是否有乱码
    maven install 跳过test方法
    echarts实现动态传入数据刷新【可执行】
    echarts报错Cannot read property 'features' of undefined
    【java web】Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    程序员,我们都是夜归人【转】
    程序员你为什么这么忙?【转】
  • 原文地址:https://www.cnblogs.com/juepei/p/4362828.html
Copyright © 2011-2022 走看看