目录

ActiveMQ 5.15.4 集成 Spring Boot 2.0.3

pom.xml 依赖

application.yml 配置

@JmsListener 接收消息

JmsTemplate 发送消息

运行测试

内嵌启动 ActiveMQ 服务


ActiveMQ 5.15.4 集成 Spring Boot 2.0.3

1、SpringBoot 提供了对 JMS 的支持,对主流的消息中间件如 RabbitMQ、Apache Kafka、Apache ActiveMQ 等都提供了集成。

2、参照 spring boot 官方文档 ActiveMQ Support 即可轻松集成 ActiveMQ 与 Spring Boot。

3、本文演示环境:Spring Boot 2.0.3 + ActiveMQ 5.25.4 + IDEA 2018。整体结构如下 MessageConsumer 作为消息消费者,监听消息并打印到控制台,MessageController 作为控制层,用户从页面请求发送消息。

(单独运行解压的 ActiveMQ 5.15.9 作为消息服务器)

pom.xml 依赖

1、新建 Spring Boot web 应用,pom.xml 文件内容如下:

<properties><java.version>1.8</java.version>
</properties>
<dependencies><!--使用 spring-boot-starter-activemq,将提供连接或嵌入activemq实例所需的依赖项--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

spring-boot-starter-activemq : spring boot 集成的 activemq 依赖,spring boot 2.0.3 版本集成 activemq 5.15.4 版本

spring-boot-starter-web:创建 web 应用,后续可以从浏览器发送消息,方便测试。

application.yml 配置

1、activemq 配置由 spring.activemq.* 属性控制,下面简单演示几项:

spring:activemq:broker-url: 'tcp://localhost:61616'   #ActiveMQ服务请求地址,不写时默认为 tcp://localhost:61616in-memory: true   #默认代理 URL 是否应在内存中,默认为 truepool:enabled: false  #是否应创建 JmsPoolConnectionFactory,而不是常规的 ConnectionFactory,默认 falsemax-connections: 50   #最大池连接数jms:cache:session-cache-size: 5  #会话缓存的大小(每个jms会话类型),默认为 1

更多详细配置参考官网:https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/htmlsingle/#common-application-properties

ActiveMQProperties.java:https://github.com/spring-projects/spring-boot/blob/v2.1.6.RELEASE/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jms/activemq/ActiveMQProperties.java

@JmsListener 接收消息

1、接收消息只需要一个 @JmsListerner 注解即可,自动会监听指定消息队列的消息,官网传送 Receiving a Message。

import org.springframework.jms.annotation.JmsListener;
import org.springframework.stereotype.Component;
/*** 消息消费者*/
@Component
public class MessageConsumer {/*** 当 jms 基础设施存在时,任何 bean 都可以用 @JmsListener 注解创建监听器端点,如果未定义 JmsListenerContainerFactory,则会自动配置默认值。* 默认情况下,默认工厂是事务性的。如果在存在 JtaTransactionManager 的基础结构中运行,则默认情况下它与侦听器容器相关联* @param message*/@JmsListener(destination = "my-queue")public void receiveMessage(String message) {System.err.println("接收到了消息: " + message);}/*** 可以同时监听任意多个消息队列,都会自动接收消息。* @param message*/@JmsListener(destination = "my-queue2")public void receiveMessage2(String message) {System.out.println("收到消息:" + message);}
}

JmsTemplate 发送消息

1、JmsTemplate 对 Spring boot 支持的所有 JMS 库提供了统一操作的 API。程序员不用再像调用原生的 ActiveMQ API 一样去考虑打开连接、打开、关闭 Session 等操作。官网传送 Sending a Message。

import com.fasterxml.jackson.databind.node.JsonNodeFactory;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.apache.activemq.command.ActiveMQQueue;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.jms.Destination;
/*** jms 消息控制层*/
@RestController
@RequestMapping("jms")
public class MessageController {/**spring 的 JmsTemplate 是自动配置,可以直接注入使用,如同 JdbcTemplate 一样,非常方便,封装好了 API,直接调用即可*/@Autowiredprivate JmsTemplate jmsTemplate;/**JmsMessagingTemplate 对 JmsTemplate 进行了封装,都可以用来发送消息*/@Autowiredprivate JmsMessagingTemplate jmsMessagingTemplate;/**请求地址:http://localhost:8080/jms/sendMessage1?message=谢三哥* @param message:待发送的消息* @return*/@GetMapping("sendMessage1")public String sendMessage1(String message) {String formatMessage = messageFormat(message);Destination destination = new ActiveMQQueue("my-queue");/**创建消息队列,自定义队列名称*//**convertAndSend(D destination, Object payload):转换与发送消息,destination:目的地,payload:待发送的消息,底层调用 send 方法* send(D destination, Message<?> message):发送消息,convertAndSend 方法会将原始消息加入消息头转换成真正能发送的消息(Message)* 支持发送的消息类型有:String, byte array, Map<String,?>, Serializable object.* 如下所示如果直接传 jsonNodes,则会抛异常,因为不支持 jsonNodes* 待发送的消息不能为 null,也不建议为空,否则接收端默认会抛异常*/jmsTemplate.convertAndSend(destination, formatMessage);return formatMessage;}/**发送消息。请求地址:http://localhost:8080/jms/sendMessage2?message=张三哥* @param message:待发送的消息* @return*/@GetMapping("sendMessage2")public String sendMessage2(String message) {String formatMessage = messageFormat(message);Destination destination = new ActiveMQQueue("my-queue2");/**创建消息队列,自定义队列名称*/jmsMessagingTemplate.convertAndSend(destination, formatMessage);/**转换与发送消息*/return formatMessage;}/*** 将待发送的消息先进行 json 格式化一下,便于传输与取值。** @param message :用户待发送的原始消息* @return :返回转换好的 json 格式的消息*/private String messageFormat(String message) {JsonNodeFactory jsonNodeFactory = JsonNodeFactory.instance;ObjectNode jsonNodes = jsonNodeFactory.objectNode();jsonNodes.put("message", message);//message 为 null 时,照样可以 putjsonNodes.put("status", 200);jsonNodes.put("timeStamp", System.currentTimeMillis());return jsonNodes.toString();}
}

运行测试

1、先启动 ActiveMQ 消息服务器,然后启动本应用,访问浏览器地址,MessageConsumer 能接收到消息,便说明成功了。

项目源码:https://github.com/wangmaoxiong/active_mq_2

内嵌启动 ActiveMQ 服务

1、实际生产环境中大多还是将 ActiveMQ 单独作为服务器启动,但是平时开发、测试时使用内嵌的 ActiveMQ 服务也是很方便的,就像内嵌 tomcat 服务器一样。

2、《ActiveMQ 命令行启动 与 嵌入式启动》中已经介绍了 "嵌入式启动",不过彼时是 Maven 管理的 Java SE 应用,现在是 Spring Boot web 应用。

3、仍然可以沿用此思路,使用 BrokerService API 进行内嵌启动,在 spring boot 启动后自动执行 brokerService.start() 启动即可,显然容易想到的是用 ServletContextListener 应用启动监听器。监听到应用启动后,执行 brokerService.start() 启动内嵌的 ActiveMQ 服务。(这只是多种方式中的其中一个思路,仅供参考)

4、内嵌 ActiveMQ 服务器时,还需要再添加 activemq-kahadb-store 依赖:

<!--使用 spring-boot-starter-activemq,将提供连接或嵌入activemq实例所需的依赖项-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<!--ActiveMQ 服务器内嵌启动时,需要添加 activemq-kahadb-store,用于数据持久化-->
<dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-kahadb-store</artifactId>
</dependency>

5、然后写一个应用启动监听器,实现 ServletContextListener 即可,在应用启动初始化方法中启动 ActiveMQ 服务:

import org.apache.activemq.broker.BrokerService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
/*** 标准的 Servlet 监听器。*/
public class SystemListener implements ServletContextListener {private static final Logger logger = LoggerFactory.getLogger(SystemListener.class);/*** 应用启动时自动执行* @param servletContextEvent*/@Overridepublic void contextInitialized(ServletContextEvent servletContextEvent) {try {logger.info("应用启动......");/**设置 ActiveMQ 消息服务器用于被客户端连接的 url 地址,实际开发中,地址应该在配置文件中可配置,不要写死*/String serviceURL = "tcp://localhost:61616";/**BrokerService 表示 ActiveMQ 服务,每一个 BrokerService 表示一个消息服务器实例* 如果想启动多个,只需要 start 多个不同端口的 BrokerService 即可*/BrokerService brokerService = new BrokerService();brokerService.setUseJmx(true);//设置是否应将代理的服务公开到jmx中。默认是 truebrokerService.addConnector(serviceURL);//为指定地址添加新的传输连接器/**启动 ActiveMQ 服务,此时客户端便可以使用提供的地址进行连接,然后发送消息过来,或者从这里消费消息。* 注意:这里内嵌启动后,默认是没有提供 8161 端口的 web 管理界面的,照样能做消息中间件使用*/brokerService.start();logger.info("启动内嵌 ActiveMQ 服务器完成......");} catch (Exception e) {logger.error("启动内嵌 ActiveMQ 服务器失败...");}}/**应用销毁时自动执行*/@Overridepublic void contextDestroyed(ServletContextEvent servletContextEvent) {logger.info("应用关闭......");}
}

6、然后写一个配置类注册 servlet 容器启动监听器:

import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**系统配置类*/
@Configuration
public class SystemConfig {/*** 注册 Servlet 三大组件 之  Listner* 添加 ServletListenerRegistrationBean ,就相当于以前在 web.xml 中配置的 <listener></listener>标签*/@Beanpublic ServletListenerRegistrationBean myListener() {/**ServletListenerRegistrationBean<T extends EventListener> 使用的是泛型,可以注册常见的任意监听器* 将自己的监听器注册进来*/ServletListenerRegistrationBean registrationBean =new ServletListenerRegistrationBean(new SystemListener());return registrationBean;}
}

7、其它代码不用修改,现在可以关闭独立启动的 ActiveMQ 服务器了,使用内嵌 activeMQ 服务。测试运行:

Spring Boot 2.0.3 集成 ActiveMQ 5.15.4 与 内嵌启动 ActiveMQ 服务相关推荐

  1. 基于Spring Boot 2.0的IoT应用集成和使用CSE实践

    本文通过一个IoT的应用展现在Spring Boot 2.0中集成和使用CSE.IoT应用原来使用Spring Boot 2.0开发,通过少量的步骤集成CSE,然后展现了集成后带来了哪些新特性,以及中 ...

  2. Spring Boot 3.0.0-M1 Reference Documentation(Spring Boot中文参考文档) 9-16

    9. 数据 Spring Boot与多个数据技术集成,包括SQL和NoSQL. 9.1. SQL数据库 Spring Framework提供扩展支持用于与SQL数据工作,从使用JdbcTemplate ...

  3. spring boot 2.0 集成shiro注意事项

    2019独角兽企业重金招聘Python工程师标准>>> spring boot 2.0 全面拥抱java8,在安全验证上面 很大程度的简化了配置项,用shiro就要把security ...

  4. Spring Boot 2.0.0参考手册_中文版

    Spring Boot参考文档 第一部分:Spring Boot文档 1. 关于文档 Sring参考文档可以通过html,pdf和epub 三种形式得到.最新的文档可以从docs.spring.io/ ...

  5. 终于把 Spring Boot 3.0 写成书了!

    大家好,我是R哥. 我的新书<Spring Boot 3 核心技术与最佳实战>打磨一年多,今天终于上市了,定价 158 元,今天刚上市搞 5 折促销,80 元不到上车,这可能是全网最便宜的 ...

  6. Spring Boot 3.0.0 发布第一个里程碑版本M1,你的 Java 升到 17 了吗?

    欢迎关注方志朋的博客,回复"666"获面试宝典 ‍ ‍文章来源:程序猿DD‍ ‍ 2022年1月20日,Spring官方发布了Spring Boot 3.0.0的第一个里程碑版本M ...

  7. Spring Boot 2.0官方文档之 Actuator

    https://blog.csdn.net/alinyua/article/details/80009435 前言:本文翻译自Spring Boot 2.0.1.RELEASE官方文档,该Spring ...

  8. Elasticsearch-06 Spring Boot 2.0.9整合ElasticSearch5.6.16

    文章目录 概述 官方JAVA API文档 工程 pom.xml es配置文件 Es配置类 控制层 简单查询 新增数据 删除数据 更新数据 复合查询 其他 新建索引 删除索引 判断index中某个typ ...

  9. SpringBoot2.0(一):【重磅】Spring Boot 2.0权威发布

    就在昨天Spring Boot2.0.0.RELEASE正式发布,今天早上在发布Spring Boot2.0的时候还出现一个小插曲,将Spring Boot2.0同步到Maven仓库的时候出现了错误, ...

  10. Spring Boot 2.0 正式发布

    转载自 重磅:Spring Boot 2.0 正式发布! Spring Boot 2.0 正式发布! 2018/03/01最新消息,传得沸沸扬扬的Spring Boot 2.0 正式发布了. 小编去看 ...

最新文章

  1. QT官方第三方开源工具
  2. 小米5点位图_5.22首域金融午评:次日02:00 美联储公布5月货币政策会议纪要
  3. win7系统稳定测试软件,win7系统电脑测试cpu性能的方法(图文)
  4. netty在项目中实际使用_聚合氯化铝在实际使用中的用法和用量
  5. mysql抖动可能的原因_MySQL应对网络抖动问题
  6. linux端口转发_详解Linux网桥功能--概念、工作机制、相关命令及实例说明
  7. leetcode刷题——415. 字符串相加
  8. 【C++】C++11 新特性(auto,decltype,nullptr,快速遍历,【Lambda表达式详解】)
  9. SGU-169 Numbers(找规律)
  10. 【Spring-AOP】Spring提供的AOP开发方式和底层AOP开发方式
  11. 【数据分析软件】【Weka】第一课:超easy安装教程
  12. kali利用fluxion无线网络钓鱼
  13. 3月9日火箭vs黄蜂
  14. 大陆期货11月3日钢材日评
  15. uniapp 动态设置导航栏标题 副标题 背景图片 web-view
  16. LCD1602开始--麒麟座OK
  17. HDMI转Displayport转换器支持4K分辨率
  18. 计算机二级excel服装采购表,计算机二级excel真题:制作采购成本分析表
  19. PMP之项目成本管理
  20. 计算机硬件耗电,耗电大户不一定就“费电”_主板评测-中关村在线

热门文章

  1. SilverLight学习之基本图形
  2. hdoj 2046 骨牌铺方格(递推)
  3. 宏转录组方法_高级转录组分析和R语言数据可视化第12期 (线上线下同时开课)
  4. 拓端tecdat|R语言广义线性模型GLM、多项式回归和广义可加模型GAM预测泰坦尼克号幸存者
  5. 拓端tecdat|R语言广义线性模型(GLMs)算法和零膨胀模型分析
  6. 拓端tecdat|R语言实现 Copula 算法建模相依性案例分析报告
  7. 18秋学期计算机基础在线作业2,东北大学(本部)18秋学期《计算机应用基础》在线作业2答案解析.doc...
  8. 基于最大正向匹配算法的中文分词
  9. python多进程调度模块multiprocessing实践实践
  10. 记一次Win10环境python3.7安装dlib模块趟过的坑