ActiveMQ学习笔记(四)https://my.oschina.net/u/3448551/blog/1503762中记录了如何使用原生的方式从ActiveMQ中收发消息。可以看出,每次收发消息都要写许多重复的代码,Spring 为我们提供了更为方便的方式,这就是Spring JMS。我们通过一个例子展开讲述。包括队列、主题消息的收发相关的Spring配置、代码、测试。
-
使用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>
-
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"/> <!– 消息目的地,因为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.niclee.jf.serviceImpl.DefaultMessageQueueListener"> </bean> <!--<bean id="jmsListenerTwo" class="com.niclee.jf.serviceImpl.ListenerTwo"> </bean>--> </beans>
-
消息生产者
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); } }); } }
-
消息消费者
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(); } } }