ActiveMQ与SpringMVC整合实现发送PTP和订阅发布消息功能
实现一个基于SpringMVC+JMS+ActiveMQ+Tomcat+JDK1.8+IDEA工具 ,Spring4.1.0和ActiveMQ5.15整合的实例,实现PTP和订阅/发布两种消息模型
一 添加依赖
这里我贴上我所有的依赖,其中有个坑就是springaop要用高版本,否则会报方法找不到,主要就是spring提供的jms依赖
- <dependencies>
- <!--activeMQ-->
- <dependency>
- <groupId>org.apache.activemq</groupId>
- <artifactId>activemq-all</artifactId>
- <version>5.15.5</version>
- </dependency>
- <!--spring-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-context</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <!--大坑,aop千万要用高版本的,否则会一直报错-->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-aop</artifactId>
- <version>4.3.12.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-beans</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-core</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-orm</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-test</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.8.1</version>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjrt</artifactId>
- <version>1.8.1</version>
- </dependency>
- <!-- springmvc -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-tx</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-expression</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-web</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>${org.springframework-version}</version>
- </dependency>
- <!-- logging -->
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>slf4j-api</artifactId>
- <version>${org.slf4j-version}</version>
- </dependency>
- <dependency>
- <groupId>org.slf4j</groupId>
- <artifactId>jcl-over-slf4j</artifactId>
- <version>${org.slf4j-version}</version>
- </dependency>
- <!-- log4j -->
- <dependency>
- <groupId>log4j</groupId>
- <artifactId>log4j</artifactId>
- <version>1.2.17</version>
- </dependency>
- <!--spring-JMS
- Spring提供了对JMS的支持,需要添加Spring支持jms的包
- -->
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jms</artifactId>
- <version>4.1.0.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.11</version>
- <scope>test</scope>
- </dependency>
- </dependencies>
二 设计目录结构
三 整合文件配置(重点)
主要是mq整合配置,需要注意的就是头文件要加上引用的,这里都贴上:
spring配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ -->
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 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/context
- http://www.springframework.org/schema/context/spring-context-4.0.xsd
- http://activemq.apache.org/schema/core
- http://activemq.apache.org/schema/core/activemq-core-5.9.0.xsd">
- <!-- 开启注解 -->
- <context:annotation-config></context:annotation-config>
- <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
- <!-- 配置扫描路径 -->
- <context:component-scan base-package="com.hou">
- <!--扫描serveice等注解的类-->
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
- <!--排除Controller,Controller由springmvc加载-->
- <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- </beans>
springmvc配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ -->
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:aop="http://www.springframework.org/schema/aop"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:mvc="http://www.springframework.org/schema/mvc"
- xmlns:tx="http://www.springframework.org/schema/tx"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/aop
- http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-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/tx
- http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
- <!-- 启用MVC注解 -->
- <mvc:annotation-driven />
- <!-- 静态资源文件,不会被Spring MVC拦截 -->
- <mvc:resources location="/resources/" mapping="/resources/**"/>
- <!-- 指定Sping组件扫描的基本包路径 -->
- <context:component-scan base-package="com.hou" >
- <!-- 这里只扫描Controller,不可重复加载Service -->
- <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
- </context:component-scan>
- <!-- JSP视图解析器-->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/" />
- <property name="suffix" value=".jsp" />
- <!-- 定义其解析视图的order顺序为1 -->
- <property name="order" value="1" />
- </bean>
- </beans>
mq整合配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:context="http://www.springframework.org/schema/context"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
- xmlns:jms="http://www.springframework.org/schema/jms"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-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/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.8.0.xsd">
- <!-- ActiveMQ 连接工厂 -->
- <amq:connectionFactory id="amqConnectionFactory"
- brokerURL="tcp://localhost:61616" userName="houzheng" password="houzheng" />
- <!-- Spring Caching连接工厂 -->
- <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
- <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
- <!--JMS 连接工厂-->
- <constructor-arg ref="amqConnectionFactory" />
- <!-- Session缓存数量 -->
- <property name="sessionCacheSize" value="100" />
- </bean>
- <!--生产者配置Bean,JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息-->
- <!-- 定义JmsTemplate的Queue类型 -->
- <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
- <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
- <constructor-arg ref="connectionFactory" />
- <!--可配置默认的Destination-->
- <!--<property name="defaultDestination" ref="demoQueueDestination" />-->
- <!--接受超时-->
- <!--<property name="receiveTimeout" value="10000" />-->
- <!-- true是topic,false是queue,默认是false,此处显示写出false -->
- <property name="pubSubDomain" value="false" />
- </bean>
- <!-- 定义JmsTemplate的Topic类型 -->
- <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
- <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
- <constructor-arg ref="connectionFactory" />
- <property name="pubSubDomain" value="true" />
- </bean>
- <!-- 定义Queue监听器 -->
- <jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
- <!--配置每一个消费者的消息监听处理-->
- <jms:listener destination="queue" ref="queueReceiver01"/>
- <jms:listener destination="queue" ref="queueReceiver02"/>
- </jms:listener-container>
- <!-- 定义Topic监听器 -->
- <jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
- <jms:listener destination="topic" ref="topicReceiver01"/>
- <jms:listener destination="topic" ref="topicReceiver02"/>
- </jms:listener-container>
- </beans>
四 开发java代码
首先开发消息发送类,因为通过xml与注解配置了bean,所以可直接注入jms模板发送消息:
- @Service
- public class QueueSender {
- //当需要注入的实现类有多个时,可以通过@Qualifier指定注入我们需要的实现类,按名字
- @Autowired
- @Qualifier("jmsQueueTemplate")
- private JmsTemplate jmsTemplate;
- /**
- * 发送一条消息到指定的队列(目标)
- * @param queueName 队列名称
- * @param message 消息内容
- */
- public void send(String queueName,final String message){
- jmsTemplate.send(queueName, new MessageCreator() {
- @Override
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage(message);
- }
- });
- }
- }
主题发送类:
- @Service
- public class TopicSender {
- @Autowired
- @Qualifier("jmsTopicTemplate")
- private JmsTemplate jmsTemplate;
- /**
- * 发送一条消息到指定的队列(目标)
- * @param queueName 队列名称
- * @param message 消息内容
- */
- public void send(String topicName,final String message){
- jmsTemplate.send(topicName, new MessageCreator() {
- @Override
- public Message createMessage(Session session) throws JMSException {
- return session.createTextMessage(message);
- }
- });
- }
- }
另外这里的jmsTemplate还可以根据需求设置是否持久化,优先级,超时,目的地等等
然后是消费者,因为配置了监听器,所以只需要实现监听接口就可以:
- @Component
- public class QueueReceiver01 implements MessageListener {
- @Override
- public void onMessage(Message message) {
- System.out.println("1号消费者接受到队列的消息:"+message.toString());
- }
- }
- //实现MessageListener消息监听器,实际中肯定不可能主动去接受消息,所以一般是用监听器
- @Component
- public class TopicReceiver01 implements MessageListener {
- @Override
- public void onMessage(Message message) {
- System.out.println("1号消费者接受到订阅的消息:"+message.toString());
- }
- }
最后是controller:
- package com.hou.springmq.controller;
- import com.hou.springmq.mq.producer.queue.QueueSender;
- import com.hou.springmq.mq.producer.topic.TopicSender;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
- import org.springframework.web.bind.annotation.RequestParam;
- import org.springframework.web.bind.annotation.ResponseBody;
- @Controller
- @RequestMapping("/mq")
- public class ActiveMQController {
- //注入发送类
- @Autowired
- private QueueSender queueSender;
- @Autowired
- private TopicSender topicSender;
- //测试方法
- @RequestMapping(value = "/test", method = RequestMethod.GET)
- @ResponseBody
- public String test01(){
- System.out.println("----------");
- return "houzheng";
- }
- //发送队列
- @ResponseBody
- @RequestMapping("/sendQueue")
- public String sendQueue(@RequestParam("message")String message){
- //消息发送到指定的queue
- queueSender.send("queue",message);
- return "suc";
- }
- //发送主题
- @ResponseBody
- @RequestMapping("/sendTopic")
- public String sendTopic(@RequestParam("message")String message){
- topicSender.send("topic",message);
- return "suc";
- }
- }
五 启动mq,测试
topic所有消费者都会收到,而queue只有一个消费者会接受到!
最后,我这个整合主要是参考这个博客,部分代码也是直接拿过来学习用的,写的挺好:https://blog.csdn.net/jiuqiyuliang/article/details/48758203
因为一直用vue,html5 ,jsp都快忘光了,还有spring的一些配置,正好复习下,学习回顾!
源码:
最后放上源码下载地址,在我的码云里面,欢迎大家指正交流!
https://gitee.com/houzheng1216/architect/tree/master/
在里面的activemqspring中
ActiveMQ与SpringMVC整合实现发送PTP和订阅发布消息功能的更多相关文章
- JMS学习之路(一):整合activeMQ到SpringMVC
JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...
- JMS学习之路(一):整合activeMQ到SpringMVC 转载:http://www.cnblogs.com/xiaochangwei/p/5426639.html
JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...
- 六:Dubbo与Zookeeper、SpringMvc整合和使用
DUBBO与ZOOKEEPER.SPRINGMVC整合和使用 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架 ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
原文链接:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 ...
- 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)转
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...
- 【转载】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)
http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及 ...
- springMVC整合jedis+redis,以注解形式使用
前两天写过 springMVC+memcached 的整合,我从这个基础上改造一下,把redis和springmvc整合到一起. 和memcached一样,redis也有java专用的客户端,官网推荐 ...
随机推荐
- Java变量初始化之后的默认值问题
1) 局部变量初始化(局部变量:函数.语句中的变量,只在所属区域内有效)局部变量声明后,Java虚拟机不会自动给它初始化为默认值.因此对于局部变量,必须经过显示的初始化,才能使用它.如果使用一个没有被 ...
- 删除XML文件中的空格
应要求需要删除xml文件中的空格,制表符等字符.要求双引号和xml的text属性中包含的空格不删除. bool delSpace(QFile &file, QString path) //删除 ...
- Matplotlib风羽自定义
[前言]对于气象专业的小学生来说,风场是预报重要的参考数据,我们所知的风羽有四种:短线代表风速2m/s,长线代表风速4m/s,空心三角代表风速20m/s,实心三角代表风速50m/s.而matplotl ...
- Ifter Party LightOJ - 1014(水题)
题意:有C个人,给P个食物,每人吃Q个,剩L个.然后给你P和L(Q>L),让你求Q的可能情况,如果有多种可能,从小到大输出:如果不存在,输出impossible 就是求写出公式 遍历c求P-L的 ...
- Spanning Tree Protocol (STP) in NetScaler Appliance
Spanning Tree Protocol (STP) in NetScaler Appliance 来源 https://support.citrix.com/article/CTX112341 ...
- Android Emoji兼容包使用详解
Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以, ...
- 【poj2127】 Greatest Common Increasing Subsequence
http://poj.org/problem?id=2127 (题目链接) 题意 计算两个序列$a$和&b$的最长公共上升子序列. Solution 爸爸的$n^3$算法莫名其妙RE了,不爽之 ...
- DUBBO - 分布式框架
http://dubbo.io/ http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%85%A5%E9%97%A8
- 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量
我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...
- 解题:BZOJ 3884 上帝与集合的正确用法
题面 好久以前写的,发现自己居然一直没有写题解=.= 扩展欧拉定理:在$b>φ(p)$时有$a^b \equiv a^{b\%φ(p)+φ(p)}(mod$ $p)$ 然后每次递归那个$a^{b ...