点击上方Java资料社区,选择“置顶公众号”
优质文章,第一时间送达
引言
续上两篇"ActiveMQ基础"、"ActiveMQ与JMS结合代码详细介绍"文章,本文将使用springBoot集成ActiveMQ使用更方便更快捷的方式进行开发;
如果您是第一次阅读的读者建议先阅读上两篇文章以便更好理解;
在讲解本文前首先补充一个上篇落下的点"ActiveMQ与JMS结合代码详细介绍",也就是ActiveMQ持久化概念,在上两篇文章我们了解了点对点和发布订阅模式,我们知道对于生产者发送消息到ActiveMQ中会对消息进行缓存,我们不必担心生产者和消费者任何一方会挂掉的情况下会导致消息的丢失,但是有没有想过如果是ActiveMQ挂掉了呢?消息是否还会存在呢?答案是肯定不存在的,ActiveMQ作为消息的载体消息默认都是存放在内存当中如果MQ挂掉了内存将全部被清除(具体大家可以模拟一下,先往MQ中发消息,然后将MQ的进程关闭,再重启查看后台页面,所有消息都会被清零),所以这里补充一下该情况的解决办法;
在ActiveMQ中有三种持久化的方式,分别是jdbc、leveldb、kahadb,现在官方推荐的是kahadb;
最初是使用的jdbc的方式进行持久化,也就是将消息存入到数据库中,但是用数据库去做持久化并不是长久之计,比较性能方面会到达瓶颈;
第二种leveldb是谷歌开源的一个磁盘KT存储系统,因为存储在磁盘中相对于数据库来说性能方面要高很多,而且该系统应用也很广泛;
第三种kahadb也是一个基于磁盘的存储系统,据说应该是由activeMQ团队开发,至于为什么后面两种都是基于磁盘官方却只推荐kahadb,理由我认为应该是leveldb作为第三方系统,没有自己开发的系统方便维护,activeMQ如果更新到新版本而leveldb并没有维护就有可能会造成一些Bug;
在代码中我们也必须要开启持久化设置才能以kahadb方式进行持久化,可以使用生产者组件中的setDeliveryMode方法进行开启;
producer.setDeliveryMode(DeliveryMode.PERSISTENT);//1:不使用持久化 2:开启持久化
开启持久化后大家可以再测试模拟MQ宕机的情况,会发现重启MQ之后依然存在,原因:在开启持久化之后,生产者将成功发送带队列中的消息保存到物理磁盘,我们可以找到activeMQ安装目录中data文件下中的kahadb文件夹:
data后缀的文件也就是持久化下来的消息数据,这个存放持久化文件的目录也可以通过activeMQ安装目录中的conf文件夹下的activemq.xml文件进行修改;
持久化方面就补充到这里了,还有什么需要补充的可以在后台加我微信与我联系,下面进入springBoot集成环节;
构建springBoot脚手架
pom:
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0modelVersion> <parent> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-parentartifactId> <version>2.1.4.RELEASEversion> <relativePath/> parent> <groupId>com.springBoot_ActiveMQ_ProducergroupId> <artifactId>demoartifactId> <version>0.0.1-SNAPSHOTversion> <name>demoname> <description>Demo project for Spring Bootdescription> <properties> <java.version>1.8java.version> properties> <dependencies> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-activemqartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> dependencies> <build> <plugins> <plugin> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-maven-pluginartifactId> plugin> plugins> build>project>
创建生产者配置类QueueConfig
@Configurationpublic class QueueConfig { //点对点队列目的地 private final String queue="springboot-queue"; //主题目的地 private final String topic="springboot-topic"; @Bean public ActiveMQQueue logQueue() { return new ActiveMQQueue(queue); } @Bean public ActiveMQTopic logTopic() { return new ActiveMQTopic(topic); }}
创建Controller类测试
@RestControllerpublic class ProducerController { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired private Queue queue; @Autowired private Topic topic; @RequestMapping("/sendQueue") public void sendQueue(String msg) { // 指定消息发送的目的地及内容 this.jmsMessagingTemplate.convertAndSend(queue, msg); } @RequestMapping("/sendTopic") public void sendTopic(String msg) { // 指定消息发送的目的地及内容 this.jmsMessagingTemplate.convertAndSend(topic, msg); }}
启动activeMQ进行测试,先调用点对点模式生产者进行发送消息:
调用后去看一下消息是否到达activeMQ中:
接着再调用发布者接口,向activeMQ中发布消息:
创建消费者项目
跟生产者项目基本一致,引入同样的依赖,全局配置application.yml如下:
spring: activemq: broker-url: tcp://127.0.0.1:61616 user: admin password: adminserver: port: 8081
由于springBoot中默认只能设置一种消息模式,要么就点对点要么就发布订阅,但是由于本文讲解了两种模式就必须接收两种模式,所以在上方的全局配置中并没有具体设置spring.jms.pub-sub-domain指定消息模式,只能重写JMS监听器设置不同的监听模式:
JmsListenerConfig:
@Configurationpublic class TopicConfig { //Topic模式 @Bean public JmsListenerContainerFactory> jmsListenerContainerTopic(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain(true); bean.setConnectionFactory(connectionFactory); return bean; } //Queue模式 @Bean public JmsListenerContainerFactory> jmsListenerContainerQueue(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setConnectionFactory(connectionFactory); return bean; }}
接着再创建两个监听器,一个监听点对点模式,一个监听发布订阅模式
ConsumerP2P
@Componentpublic class ConsumerP2P { @JmsListener(destination = "springboot-queue",containerFactory = "jmsListenerContainerQueue") @SendTo("SQueue") public void receiveQueue(String msg) { System.out.println("queue监听器收到msg:" + msg); } }
ConsumerP2S
@Componentpublic class ConsumerP2S { @JmsListener(destination = "springboot-topic",containerFactory = "jmsListenerContainerTopic") public void receiveTopic1(String msg) { System.out.println("topic1监听器收到msg:" + msg); } @JmsListener(destination = "springboot-topic",containerFactory = "jmsListenerContainerTopic") public void receiveTopic2(String msg) { System.out.println("topic2监听器收到msg:" + msg); }}
@JmsListener:用来标注某个方法上,表示用来接收消息,属性:destination用来设置消息来源目的地,containerFactory用来设置一个监听的实现,具体可以设置Queue和Topic模式,也就是我们在配置类中所声明的两种,默认是Queue;
测试一下,启动两个项目通过生产者接口进行发送等待消费者的变化;
源码:关注公众号回复[mq005]
Ok,本章就到这里了,有什么不懂的地方可以加我微信或者我拉你进读者交流群大家一起交流学习!
如果大家觉得有用 请分享出去 让更多人看到!予人玫瑰手有余香
1. ActiveMQ基础概念
2. ActiveMQ与JMS结合代码详细介绍
3. springBoot发送邮件
4. springBoot整合Log4j2
5. springBoot整合i18n国际化
6. springBoot配置SSL搭建HTTPS
7. springBoot定时备份数据邮件通知
8. springBoot数据访问整合mybatis
9. springBoot数据访问整合swagger2