消息中间件学习四--ActiveMq与SpringBoot集成
1.消息队列的点对点,发布订阅
第一种:点对点模式分析(也叫队列模式)
流程:
activemq消息发送流程: 1.消息生产者把消息发送到activemq消息服务器进行存储 1)消息生产者发送消息,首先需要在activemq消息服务器中开辟一块空间,存储消息 2)并且必须给这块空间起一个标识,用来唯一标识这块消息空间
2.消息消费者必须监听这块空间(此空间监听方法是根据空间标识监听的),
监听空间标识必须和消息生产标识一致
注:消息消费者主动拉取消息
特点:点对点消息模式的特点:
1.一条消息只能被一个消费者接收。
2.一条消息被消费后就消失了。
3.如果这条消息一致没有被消费,那就一直等待,直到被消费为止。
4.如果有多个消费者同时监听消息空间,遵循先来后到的原则,谁第一个拉取,就给谁消费。
2.一条消息被消费后就消失了。
3.如果这条消息一致没有被消费,那就一直等待,直到被消费为止。
4.如果有多个消费者同时监听消息空间,遵循先来后到的原则,谁第一个拉取,就给谁消费。
第二种:发布/订阅模式
图解:
2.搭建
第一步:引入ActiveMq依赖(pom.xml)
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
添加热部署
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <version>2.0.6.RELEASE</version> </dependency>
第二步:ActiveMq 配置
application.properties
spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.in-memory=true spring.activemq.pool.enabled=false ##开启发布订阅模式,Springboot默认Queues,采用代码配置 #spring.jms.pub-sub-domain=true
MqConfig.java(配置订阅者或者点对点)
/**============================================================================================== * 消息订阅分为:普通订阅,持久订阅 * 普通订阅 :activemq只是向当前启动的消费者发送消息。 * 持久订阅 :记录消费者的信息,实现离线消息的推送 * * * *=============================================================================================== * DESC:activeMq 配置 * USER:hmily * DATE:2017/12/28 * TIME:14:11 */ @Configuration public class MqConfig { @Autowired private ActiveMQConnectionFactory connectionFactory; /**发布定义模式Topic**/ @Bean public JmsListenerContainerFactory<?> jmsListenerContainerTopic() { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain(true); bean.setConnectionFactory(connectionFactory); return bean; } /**点对点Queue**/ @Bean public JmsListenerContainerFactory<?> jmsListenerContainerQueue() { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setConnectionFactory(connectionFactory); return bean; } }
第三步:使用
Producer
/**springBoot ActiveMq 模版**/ @Autowired private JmsMessagingTemplate jmsMessagingTemplate; /** * 产生Topic **/ @Test public void testTopic(){ Destination topic = new ActiveMQTopic("topic.test"); jmsMessagingTemplate.convertAndSend(topic,"hello topic"); } /** * 产生Queue **/ @Test public void testQueue(){ Destination queue = new ActiveMQQueue("queue.test"); jmsMessagingTemplate.convertAndSend(queue,"hello queue"); }
Consumer(重点是配置监听JmsListener)
/** * DESC:消息消费者 * USER:hmily * DATE:2017/12/28 * TIME:14:32 */ @Service public class DemoConsumer { @JmsListener(destination = "topic.test", containerFactory = "jmsListenerContainerTopic") public void testTopicCusumer(String test){ System.out.println(test); } @JmsListener(destination = "queue.test", containerFactory = "jmsListenerContainerQueue") public void testQueueCusumer(String test){ System.out.println(test); } }
学习来源:https://www.jianshu.com/p/715537657af6
https://www.jianshu.com/p/a546ed0c3f09
https://www.jianshu.com/p/66286e89573d