文档章节

ActiveMQ学习笔记(5)——使用Spring JMS收发消息

N
 NicLee
发布于 2017/08/07 10:26
字数 912
阅读 27
收藏 0

 ActiveMQ学习笔记(四)https://my.oschina.net/u/3448551/blog/1503762中记录了如何使用原生的方式从ActiveMQ中收发消息。可以看出,每次收发消息都要写许多重复的代码,Spring 为我们提供了更为方便的方式,这就是Spring JMS。我们通过一个例子展开讲述。包括队列、主题消息的收发相关的Spring配置、代码、测试。

  1. 使用maven管理依赖

    <!-- ActiveMQ -->
    <dependency>
         <groupId>org.apache.activemq</groupId>
         <artifactId>activemq-all</artifactId>
         <version>5.11.0</version>
    </dependency>
    <!-- Spring Jms -->
    <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-jms</artifactId>
         <version>4.1.2.RELEASE</version>
    </dependency>

     

  2. activemq.xml是关键的配置,如下是多队列配置,其实是配置了两个监听器,然后把各自的
    destination,sender,listener配置了两个

    <?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="#{configProperties['avtivemq.broker.url']}"/>
            <property name="userName" value="#{configProperties['avtivemq.username']}"/>
            <property name="password" value="#{configProperties['avtivemq.password']}"/>
            <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.niclee.jf.serviceImpl.SenderOne">
            <property name="jmsTemplate" ref="jmsTemplateOne"/>
            <!-- 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略
            <property name="destination" ref=" myQueue "/>-->
        </bean>
        <!--<bean id="producer2" class="com.niclee.jf.serviceImpl.SenderTwo">
            <property name="jmsTemplate" ref="jmsTemplateTwo"/>
            &lt;!&ndash; 消息目的地,因为jmsTemplate有默认的了,所以这里可以省略
            <property name="destination" ref=" myQueue "/>&ndash;&gt;
        </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.niclee.jf.serviceImpl.DefaultMessageQueueListener">
        </bean>
        <!--<bean id="jmsListenerTwo" class="com.niclee.jf.serviceImpl.ListenerTwo">
        </bean>-->
    
    </beans>

     

  3. 消息生产者

    package com.niclee.jf.serviceImpl;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jms.core.JmsTemplate;
    import org.springframework.jms.core.MessageCreator;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service;
    
    import javax.annotation.Resource;
    import javax.jms.*;
    
    /**
     * @author liyuxuan
     * @Description
     * @Email 736167815@qq.com
     * Created on 2017/8/1 下午4:28
     * Copyright (c) 2017 All Rights Reserved.
     */
    @Service
    @Component
    public class SenderOne {
    
        @Autowired
        private Destination myQueueOne;
    
        @Resource(name="jmsTemplateOne")
        private JmsTemplate jmsTemplate;
    
        public JmsTemplate getJmsTemplate() {
            return jmsTemplate;
        }
    
        public void setJmsTemplate(JmsTemplate jmsTemplate) {
            this.jmsTemplate = jmsTemplate;
        }
    
        /**
         * 向指定队列发送消息
         */
        public void sendMessage(Destination destination, final String msg) {
            System.out.println("向队列" + "myQueueOne" + "发送了消息------------" + msg);
            jmsTemplate.send(myQueueOne, new MessageCreator() {
                @Autowired
                public Message createMessage(Session session) throws JMSException {
                    return session.createTextMessage(msg);
                }
            });
        }
    
        /**
         * 向默认队列发送消息
         */
        public void sendMessage(final String msg) {
            String destination =  jmsTemplate.getDefaultDestination().toString();
            System.out.println("向队列" +destination+ "发送了消息------------" + msg);
            jmsTemplate.send(new MessageCreator() {
                @Autowired
                public Message createMessage(Session session) throws JMSException {
                    return session.createTextMessage(msg);
                }
            });
    
        }
    }

     

  4. 消息消费者

    package com.niclee.jf.serviceImpl;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.jms.JMSException;
    import javax.jms.Message;
    import javax.jms.MessageListener;
    import javax.jms.TextMessage;
    
    /**
     * @author liyuxuan
     * @Description MQ消费者
     * @Email 736167815@qq.com
     * Created on 2017/8/1 下午3:55
     * Copyright (c) 2017 All Rights Reserved.
     */
    public class DefaultMessageQueueListener implements MessageListener {
    
        private static Logger LOGGER = LoggerFactory.getLogger(DefaultMessageQueueListener.class);
    
        //当收到消息时,自动调用该方法。
        public void onMessage(Message message) {
            TextMessage tm = (TextMessage) message;
            try {
                System.out.println("ConsumerMessageListener收到了文本消息:"+ tm.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
    

     

© 著作权归作者所有

N
粉丝 1
博文 43
码字总数 17673
作品 0
浦东
私信 提问

暂无文章

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
昨天
64
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
昨天
26
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
昨天
44
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
昨天
27
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
昨天
44
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部