1、引入activemq-all-5.15.0.jar。由于activemq-all-5.15.0.jar包含了spring, 与当前引入的spring冲突, 必须把activemq-all中的spring删除。
2、applicationContext.xml配置。
<?xml version='1.0' encoding='UTF-8' ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:jms="http://www.springframework.org/schema/jms" xmlns:amq="http://activemq.apache.org/schema/core"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.15.2.xsd">
<!-- 使用注解驱动 -->
<context:annotation-config />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/cts" />
<property name="username" value="root" />
<property name="password" value="root" />
<property name="maxActive" value="255" />
<property name="maxIdle" value="5" />
<property name="maxWait" value="10000" />
</bean>
<!-- 集成mybatis -->
<bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis/mybatis-config.xml" />
</bean>
<!-- 配置数据源事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 采用自动扫描方式创建mapper bean -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.ssm.cts" />
<property name="SqlSessionFactory" ref="SqlSessionFactory" />
<property name="annotationClass" value="org.springframework.stereotype.Repository" />
</bean>
<!-- Embedded ActiveMQ Broker -->
<amq:broker id="broker" useJmx="false" persistent="false">
<amq:transportConnectors>
<!-- TCP transport 允许客户端通过TCP socket连接到远程的broker。 -->
<amq:transportConnector uri="tcp://localhost:61616"/>
<!-- VM transport 允许在VM内部通信, 从而避免了网络传输的开销。 -->
<amq:transportConnector uri="vm://localhost:0"/>
</amq:transportConnectors>
</amq:broker>
<!--activemq连接工厂 -->
<amq:connectionFactory id="activemqConnectionFactory" brokerURL="tcp://127.0.0.1:61616"
userName="admin" password="admin">
</amq:connectionFactory>
<!--spring连接工厂, 管理activemq连接工厂 -->
<bean id="connectionFactory"
class="org.springframework.jms.connection.CachingConnectionFactory">
<!--管理对象, 对应activemq连接工厂 -->
<property name="targetConnectionFactory"
ref="activemqConnectionFactory"></property>
<!--session缓存数量 -->
<property name="sessionCacheSize" value="100" />
</bean>
<!--定义消息队列 -->
<bean id="ctsQueueDestination"
class="org.apache.activemq.command.ActiveMQQueue">
<!--消息队列名称 -->
<constructor-arg>
<value>cts.queue</value>
</constructor-arg>
</bean>
<bean id="ctsTopicDestination"
class="org.apache.activemq.command.ActiveMQTopic">
<!--订阅主题名称 -->
<constructor-arg>
<value>cts.topic</value>
</constructor-arg>
</bean>
<!--消息生产者 -->
<!--队列类型JmsTemplate -->
<bean id="jmsQueueTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="ctsQueueDestination" />
<property name="receiveTimeout" value="10000" />
<!--非pub/sub (发布/订阅)模式, 即队列模式 -->
<property name="pubSubDomain" value="false" />
</bean>
<!--Topic类型JmsTemplate -->
<bean id="jmsTopicTemplate"
class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="connectionFactory" />
<property name="defaultDestination" ref="ctsTopicDestination" />
<property name="receiveTimeout" value="10000" />
<!--pub/sub(发布/订阅)模式 -->
<property name="pubSubDomain" value="true" />
</bean>
<!--队列监听器 -->
<bean id="queueMessageListen" class="com.ssm.cts.amq.QueueMessageListener" />
<!--Topic监听器 -->
<bean id="topicMessageListen" class="com.ssm.cts.amq.TopicMessageListener" />
<!--消息消费者 -->
<!--显示注入消息监听容器(Queue), 配置连接工厂, 监听的目标是ctsQueueDestination, 监听器是上面定义的监听器 -->
<bean id="queueListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="ctsQueueDestination" />
<property name="messageListener" ref="queueMessageListen" />
</bean>
<!--显示注入消息监听容器(Topic), 配置连接工厂, 监听的目标是ctsTopicDestination, 监听器是上面定义的监听器 -->
<bean id="topicListenerContainer"
class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="connectionFactory" />
<property name="destination" ref="ctsTopicDestination" />
<property name="messageListener" ref="topicMessageListen" />
</bean>
</beans>
3、QueueMessageListener.java
package com.ssm.cts.amq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import org.springframework.stereotype.Component;
/**
* CopyRright (c)2018-2028: chanpinxue.cn
* Project: cts
* Module Name: TopicMessageListener
* Comments: 消息监听器
* JDK version used: JDK1.8
* Author: jzh
* Create Date: 2018-10-25
* Modified By: jzh
* Modified Date: 2018-10-25
* Why & What is modified:
* Version: <1.0>
*/
@Component
public class QueueMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("QueueMessageListener监听到了文本消息:\t" + tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
4、TopicMessageListener.java
package com.ssm.cts.amq;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.TextMessage;
import javax.jms.MessageListener;
import org.springframework.stereotype.Component;
/**
* CopyRright (c)2018-2028: chanpinxue.cn
* Project: cts
* Module Name: TopicMessageListener
* Comments: 消息监听器
* JDK version used: JDK1.8
* Author: jzh
* Create Date: 2018-10-25
* Modified By: jzh
* Modified Date: 2018-10-25
* Why & What is modified:
* Version: <1.0>
*/
@Component
public class TopicMessageListener implements MessageListener {
@Override
public void onMessage(Message message) {
TextMessage tm = (TextMessage) message;
try {
System.out.println("TopicMessageListener监听到了文本消息:\t" + tm.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
5、ActiveMQController.java
package com.ssm.cts.controller;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
/**
* CopyRright (c)2018-2028: chanpinxue.cn
* Project: cts
* Module Name: ActiveMQController
* Comments: 控制器
* JDK version used: JDK1.8
* Author: jzh
* Create Date: 2018-10-25
* Modified By: jzh
* Modified Date: 2018-10-25
* Why & What is modified:
* Version: <1.0>
*/
// 注解@Controller表示它是一个控制器
@Controller("amqController")
// 表明当请求的URI在/my下的时候才有该控制器响应
@RequestMapping("/mq")
public class ActiveMQController {
// 注入JmsTemplate
@Autowired
private JmsTemplate jmsQueueTemplate;
@Autowired
private JmsTemplate jmsTopicTemplate;
// activemq-all-5.15.0.jar包含了spring, 与当前引入的spring冲突, 必须把activemq-all中的spring删除.
// http://127.0.0.1:8161/admin
// 表明URI是/queue的时候该方法才请求
// http://localhost:8080/cts/mq/queue.do
@RequestMapping("/queue")
public String queue() {
jmsQueueTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText("9001");
return message;
}
});
// 重定向, 从一个controller跳到另一个controller
return "redirect:/mi/index.do";
}
// 表明URI是/queue的时候该方法才请求
// http://localhost:8080/cts/mq/topic.do
@RequestMapping("/topic")
public String topic() {
jmsTopicTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText("9001");
return message;
}
});
// 重定向, 从一个controller跳到另一个controller
return "redirect:/mi/index.do";
}
}
6、启动。

http://localhost:8080/cts/mq/queue.do
http://localhost:8080/cts/mq/topic.do
