实现一个基于SpringMVC+JMS+ActiveMQ+Tomcat+JDK1.8+IDEA工具 ,Spring4.1.0和ActiveMQ5.15整合的实例,实现PTP和订阅/发布两种消息模型

一  添加依赖

这里我贴上我所有的依赖,其中有个坑就是springaop要用高版本,否则会报方法找不到,主要就是spring提供的jms依赖

  1. <dependencies>
  2. <!--activeMQ-->
  3. <dependency>
  4. <groupId>org.apache.activemq</groupId>
  5. <artifactId>activemq-all</artifactId>
  6. <version>5.15.5</version>
  7. </dependency>
  8. <!--spring-->
  9. <dependency>
  10. <groupId>org.springframework</groupId>
  11. <artifactId>spring-context</artifactId>
  12. <version>${org.springframework-version}</version>
  13. </dependency>
  14. <!--大坑,aop千万要用高版本的,否则会一直报错-->
  15. <dependency>
  16. <groupId>org.springframework</groupId>
  17. <artifactId>spring-aop</artifactId>
  18. <version>4.3.12.RELEASE</version>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework</groupId>
  22. <artifactId>spring-beans</artifactId>
  23. <version>${org.springframework-version}</version>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework</groupId>
  27. <artifactId>spring-core</artifactId>
  28. <version>${org.springframework-version}</version>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.springframework</groupId>
  32. <artifactId>spring-jdbc</artifactId>
  33. <version>${org.springframework-version}</version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework</groupId>
  37. <artifactId>spring-orm</artifactId>
  38. <version>${org.springframework-version}</version>
  39. </dependency>
  40. <dependency>
  41. <groupId>org.springframework</groupId>
  42. <artifactId>spring-test</artifactId>
  43. <version>${org.springframework-version}</version>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.aspectj</groupId>
  47. <artifactId>aspectjweaver</artifactId>
  48. <version>1.8.1</version>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.aspectj</groupId>
  52. <artifactId>aspectjrt</artifactId>
  53. <version>1.8.1</version>
  54. </dependency>
  55. <!-- springmvc -->
  56. <dependency>
  57. <groupId>org.springframework</groupId>
  58. <artifactId>spring-tx</artifactId>
  59. <version>${org.springframework-version}</version>
  60. </dependency>
  61. <dependency>
  62. <groupId>org.springframework</groupId>
  63. <artifactId>spring-expression</artifactId>
  64. <version>${org.springframework-version}</version>
  65. </dependency>
  66. <dependency>
  67. <groupId>org.springframework</groupId>
  68. <artifactId>spring-web</artifactId>
  69. <version>${org.springframework-version}</version>
  70. </dependency>
  71. <dependency>
  72. <groupId>org.springframework</groupId>
  73. <artifactId>spring-webmvc</artifactId>
  74. <version>${org.springframework-version}</version>
  75. </dependency>
  76. <!-- logging -->
  77. <dependency>
  78. <groupId>org.slf4j</groupId>
  79. <artifactId>slf4j-api</artifactId>
  80. <version>${org.slf4j-version}</version>
  81. </dependency>
  82. <dependency>
  83. <groupId>org.slf4j</groupId>
  84. <artifactId>jcl-over-slf4j</artifactId>
  85. <version>${org.slf4j-version}</version>
  86. </dependency>
  87. <!-- log4j -->
  88. <dependency>
  89. <groupId>log4j</groupId>
  90. <artifactId>log4j</artifactId>
  91. <version>1.2.17</version>
  92. </dependency>
  93. <!--spring-JMS
  94. Spring提供了对JMS的支持,需要添加Spring支持jms的包
  95. -->
  96. <dependency>
  97. <groupId>org.springframework</groupId>
  98. <artifactId>spring-jms</artifactId>
  99. <version>4.1.0.RELEASE</version>
  100. </dependency>
  101. <dependency>
  102. <groupId>junit</groupId>
  103. <artifactId>junit</artifactId>
  104. <version>4.11</version>
  105. <scope>test</scope>
  106. </dependency>
  107. </dependencies>

  

二  设计目录结构

 

三  整合文件配置(重点)


主要是mq整合配置,需要注意的就是头文件要加上引用的,这里都贴上:

spring配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ -->
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xmlns:amq="http://activemq.apache.org/schema/core"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  9. http://www.springframework.org/schema/context
  10. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  11. http://activemq.apache.org/schema/core
  12. http://activemq.apache.org/schema/core/activemq-core-5.9.0.xsd">
  13. <!-- 开启注解 -->
  14. <context:annotation-config></context:annotation-config>
  15.  
  16. <bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor"/>
  17.  
  18. <!-- 配置扫描路径 -->
  19. <context:component-scan base-package="com.hou">
  20. <!--扫描serveice等注解的类-->
  21. <context:include-filter type="annotation" expression="org.springframework.stereotype.Service" />
  22. <context:include-filter type="annotation" expression="org.springframework.stereotype.Repository" />
  23. <context:include-filter type="annotation" expression="org.springframework.stereotype.Component" />
  24. <!--排除Controller,Controller由springmvc加载-->
  25. <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  26. </context:component-scan>
  27.  
  28. </beans>

  

springmvc配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ -->
  3. <beans xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:aop="http://www.springframework.org/schema/aop"
  5. xmlns:context="http://www.springframework.org/schema/context"
  6. xmlns:mvc="http://www.springframework.org/schema/mvc"
  7. xmlns:tx="http://www.springframework.org/schema/tx"
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="http://www.springframework.org/schema/aop
  10. http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
  11. http://www.springframework.org/schema/beans
  12. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  13. http://www.springframework.org/schema/context
  14. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  15. http://www.springframework.org/schema/mvc
  16. http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
  17. http://www.springframework.org/schema/tx
  18. http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">
  19.  
  20. <!-- 启用MVC注解 -->
  21. <mvc:annotation-driven />
  22. <!-- 静态资源文件,不会被Spring MVC拦截 -->
  23. <mvc:resources location="/resources/" mapping="/resources/**"/>
  24. <!-- 指定Sping组件扫描的基本包路径 -->
  25. <context:component-scan base-package="com.hou" >
  26. <!-- 这里只扫描Controller,不可重复加载Service -->
  27. <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
  28. </context:component-scan>
  29.  
  30. <!-- JSP视图解析器-->
  31. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  32. <property name="prefix" value="/WEB-INF/" />
  33. <property name="suffix" value=".jsp" />
  34. <!-- 定义其解析视图的order顺序为1 -->
  35. <property name="order" value="1" />
  36. </bean>
  37. </beans>

  

mq整合配置:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:context="http://www.springframework.org/schema/context"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core"
  5. xmlns:jms="http://www.springframework.org/schema/jms"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
  8. http://www.springframework.org/schema/context
  9. http://www.springframework.org/schema/context/spring-context-4.0.xsd
  10. http://www.springframework.org/schema/jms
  11. http://www.springframework.org/schema/jms/spring-jms-4.0.xsd
  12. http://activemq.apache.org/schema/core
  13. http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd">
  14. <!-- ActiveMQ 连接工厂 -->
  15. <amq:connectionFactory id="amqConnectionFactory"
  16. brokerURL="tcp://localhost:61616" userName="houzheng" password="houzheng" />
  17. <!-- Spring Caching连接工厂 -->
  18. <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->
  19. <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
  20. <!--JMS 连接工厂-->
  21. <constructor-arg ref="amqConnectionFactory" />
  22. <!-- Session缓存数量 -->
  23. <property name="sessionCacheSize" value="100" />
  24. </bean>
  25.  
  26. <!--生产者配置Bean,JMS模板(Queue),Spring提供的JMS工具类,它发送、接收消息-->
  27. <!-- 定义JmsTemplate的Queue类型 -->
  28. <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate">
  29. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
  30. <constructor-arg ref="connectionFactory" />
  31. <!--可配置默认的Destination-->
  32. <!--<property name="defaultDestination" ref="demoQueueDestination" />-->
  33. <!--接受超时-->
  34. <!--<property name="receiveTimeout" value="10000" />-->
  35. <!-- true是topic,false是queue,默认是false,此处显示写出false -->
  36. <property name="pubSubDomain" value="false" />
  37. </bean>
  38. <!-- 定义JmsTemplate的Topic类型 -->
  39. <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate">
  40. <!-- 这个connectionFactory对应的是我们定义的Spring提供的那个ConnectionFactory对象 -->
  41. <constructor-arg ref="connectionFactory" />
  42. <property name="pubSubDomain" value="true" />
  43. </bean>
  44.  
  45. <!-- 定义Queue监听器 -->
  46. <jms:listener-container destination-type="queue" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
  47. <!--配置每一个消费者的消息监听处理-->
  48. <jms:listener destination="queue" ref="queueReceiver01"/>
  49. <jms:listener destination="queue" ref="queueReceiver02"/>
  50. </jms:listener-container>
  51. <!-- 定义Topic监听器 -->
  52. <jms:listener-container destination-type="topic" container-type="default" connection-factory="connectionFactory" acknowledge="auto">
  53. <jms:listener destination="topic" ref="topicReceiver01"/>
  54. <jms:listener destination="topic" ref="topicReceiver02"/>
  55. </jms:listener-container>
  56. </beans>

  

四  开发java代码

首先开发消息发送类,因为通过xml与注解配置了bean,所以可直接注入jms模板发送消息:

  1. @Service
  2. public class QueueSender {
  3. //当需要注入的实现类有多个时,可以通过@Qualifier指定注入我们需要的实现类,按名字
  4. @Autowired
  5. @Qualifier("jmsQueueTemplate")
  6. private JmsTemplate jmsTemplate;
  7. /**
  8. * 发送一条消息到指定的队列(目标)
  9. * @param queueName 队列名称
  10. * @param message 消息内容
  11. */
  12. public void send(String queueName,final String message){
  13. jmsTemplate.send(queueName, new MessageCreator() {
  14. @Override
  15. public Message createMessage(Session session) throws JMSException {
  16. return session.createTextMessage(message);
  17. }
  18. });
  19. }
  20. }

  主题发送类:

  1. @Service
  2. public class TopicSender {
  3. @Autowired
  4. @Qualifier("jmsTopicTemplate")
  5. private JmsTemplate jmsTemplate;
  6. /**
  7. * 发送一条消息到指定的队列(目标)
  8. * @param queueName 队列名称
  9. * @param message 消息内容
  10. */
  11. public void send(String topicName,final String message){
  12. jmsTemplate.send(topicName, new MessageCreator() {
  13. @Override
  14. public Message createMessage(Session session) throws JMSException {
  15. return session.createTextMessage(message);
  16. }
  17. });
  18. }
  19. }

  

另外这里的jmsTemplate还可以根据需求设置是否持久化,优先级,超时,目的地等等

然后是消费者,因为配置了监听器,所以只需要实现监听接口就可以:

  1. @Component
  2. public class QueueReceiver01 implements MessageListener {
  3. @Override
  4. public void onMessage(Message message) {
  5. System.out.println("1号消费者接受到队列的消息:"+message.toString());
  6. }
  7. }

  

  1. //实现MessageListener消息监听器,实际中肯定不可能主动去接受消息,所以一般是用监听器
  2. @Component
  3. public class TopicReceiver01 implements MessageListener {
  4. @Override
  5. public void onMessage(Message message) {
  6. System.out.println("1号消费者接受到订阅的消息:"+message.toString());
  7. }
  8. }

  最后是controller:

  1. package com.hou.springmq.controller;
  2.  
  3. import com.hou.springmq.mq.producer.queue.QueueSender;
  4. import com.hou.springmq.mq.producer.topic.TopicSender;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Controller;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RequestMethod;
  9. import org.springframework.web.bind.annotation.RequestParam;
  10. import org.springframework.web.bind.annotation.ResponseBody;
  11.  
  12. @Controller
  13. @RequestMapping("/mq")
  14. public class ActiveMQController {
  15.  
  16. //注入发送类
  17. @Autowired
  18. private QueueSender queueSender;
  19.  
  20. @Autowired
  21. private TopicSender topicSender;
  22. //测试方法
  23. @RequestMapping(value = "/test", method = RequestMethod.GET)
  24. @ResponseBody
  25. public String test01(){
  26. System.out.println("----------");
  27. return "houzheng";
  28. }
  29. //发送队列
  30. @ResponseBody
  31. @RequestMapping("/sendQueue")
  32. public String sendQueue(@RequestParam("message")String message){
  33. //消息发送到指定的queue
  34. queueSender.send("queue",message);
  35. return "suc";
  36. }
  37. //发送主题
  38. @ResponseBody
  39. @RequestMapping("/sendTopic")
  40. public String sendTopic(@RequestParam("message")String message){
  41. topicSender.send("topic",message);
  42. return "suc";
  43. }
  44. }

  

五  启动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和订阅发布消息功能的更多相关文章

  1. JMS学习之路(一):整合activeMQ到SpringMVC

    JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...

  2. JMS学习之路(一):整合activeMQ到SpringMVC 转载:http://www.cnblogs.com/xiaochangwei/p/5426639.html

    JMS的全称是Java Message Service,即Java消息服务.它主要用于在生产者和消费者之间进行消息传递,生产者负责产生消息,而消费者负责接收消息.把它应用到实际的业务需求中的话我们可以 ...

  3. 六:Dubbo与Zookeeper、SpringMvc整合和使用

    DUBBO与ZOOKEEPER.SPRINGMVC整合和使用 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架 ...

  4. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  5. 【转】Dubbo_与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    原文链接:http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服 ...

  6. 160906、Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  7. Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)转

    互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的.现在核心业务抽取出来,作为独立的服务,使 ...

  8. 【转载】Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

    http://blog.csdn.net/congcong68/article/details/41113239 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及 ...

  9. springMVC整合jedis+redis,以注解形式使用

    前两天写过 springMVC+memcached 的整合,我从这个基础上改造一下,把redis和springmvc整合到一起. 和memcached一样,redis也有java专用的客户端,官网推荐 ...

随机推荐

  1. Java变量初始化之后的默认值问题

    1) 局部变量初始化(局部变量:函数.语句中的变量,只在所属区域内有效)局部变量声明后,Java虚拟机不会自动给它初始化为默认值.因此对于局部变量,必须经过显示的初始化,才能使用它.如果使用一个没有被 ...

  2. 删除XML文件中的空格

    应要求需要删除xml文件中的空格,制表符等字符.要求双引号和xml的text属性中包含的空格不删除. bool delSpace(QFile &file, QString path) //删除 ...

  3. Matplotlib风羽自定义

    [前言]对于气象专业的小学生来说,风场是预报重要的参考数据,我们所知的风羽有四种:短线代表风速2m/s,长线代表风速4m/s,空心三角代表风速20m/s,实心三角代表风速50m/s.而matplotl ...

  4. Ifter Party LightOJ - 1014(水题)

    题意:有C个人,给P个食物,每人吃Q个,剩L个.然后给你P和L(Q>L),让你求Q的可能情况,如果有多种可能,从小到大输出:如果不存在,输出impossible 就是求写出公式 遍历c求P-L的 ...

  5. Spanning Tree Protocol (STP) in NetScaler Appliance

    Spanning Tree Protocol (STP) in NetScaler Appliance 来源 https://support.citrix.com/article/CTX112341 ...

  6. Android Emoji兼容包使用详解

    Emoji兼容性 我们经常会遇到这样的问题: 给朋友发的emoji表情, 在自己手机上展示是正常的, 但是到朋友手机上, 却没有展示出来, 或者展示出来了, 但是也跟自己手机上展示的不一样. 所以,  ...

  7. 【poj2127】 Greatest Common Increasing Subsequence

    http://poj.org/problem?id=2127 (题目链接) 题意 计算两个序列$a$和&b$的最长公共上升子序列. Solution 爸爸的$n^3$算法莫名其妙RE了,不爽之 ...

  8. DUBBO - 分布式框架

    http://dubbo.io/ http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E5%85%A5%E9%97%A8

  9. 控制对象的创建方式(禁止创建栈对象or堆对象)和创建的数量

    我们知道,C++将内存划分为三个逻辑区域:堆.栈和静态存储区.既然如此,我称位于它们之中的对象分别为堆对象,栈对象以及静态对象.通常情况下,对象创建在堆上还是在栈上,创建多少个,这都是没有限制的.但是 ...

  10. 解题:BZOJ 3884 上帝与集合的正确用法

    题面 好久以前写的,发现自己居然一直没有写题解=.= 扩展欧拉定理:在$b>φ(p)$时有$a^b \equiv a^{b\%φ(p)+φ(p)}(mod$ $p)$ 然后每次递归那个$a^{b ...