springboot 学习笔记(八)
2019-01-23 07:39:58来源:博客园 阅读 ()
springboot整合activemq,实现queue,topic同时支持
1、JMS中定义了两种消息模型:点对点(point to point, queue)和发布/订阅(publish/subscribe,topic),区别如下:
(1)queue(点对点):不可重复消费。消息生产者发送消息到queue,然后消息消费者从中取出并消费消息;消息消费后将不再存储在queue中;queue支持存在多个消费者,但是对于一条消息来说,只能有一个消费者进行消费;当消息没有消费者的时候,消息将一直保存,知道有消费者消费。
(2)topic(发布/订阅):可以重复消费。消息生产者发布消息到topic,同时有多个订阅者订阅该消息;发布到topic中的消息会被所有的订阅者消费;当生产者发布消息,不管是否有订阅者,消息都不会保存。
2、之前的笔记中对p2p的消息发布进行了测试,下面使用发布/订阅模式来进行消息发布与消费,首先要增加配置,开启发布/订阅模式:spring.jms.pub-sub-domain=true
3、登陆activemq控制台,新建topic:test.topic
4、在Application中新增代码,方便注入topic
@Bean public Topic topic() { return new ActiveMQTopic("test.topic"); }
5、添加消息发布接口及实现
/** * */ package com.zc.app.test.service; import javax.jms.Destination; /** * topic 消息发布接口 * */ public interface PublishService { public void publish(String msg) ; public void publish(Destination des,String msg); }
/** * */ package com.zc.app.test.service.impl; import javax.jms.Destination; import javax.jms.Topic; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import com.zc.app.test.service.PublishService; /** * 消息发布实现 * */ @Service public class PublishServiceImpl implements PublishService{ @Autowired private Topic topic; @Autowired private JmsMessagingTemplate jms; //发送消息 @Override public void publish(String msg) { jms.convertAndSend(topic, msg); } //发送消息到指定的topic @Override public void publish(Destination des, String msg) { jms.convertAndSend(des, msg); } }
6、增加消息订阅者
/** * */ package com.zc.app.test.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; /** * 消息消费者 * */ @Component public class TopicSubscribe { @JmsListener(destination="test.topic") public void ubscribe1(String msg) { System.out.println("消息订阅者1:"+msg); } @JmsListener(destination="test.topic") public void ubscribe2(String msg) { System.out.println("消息订阅者2:"+msg); } @JmsListener(destination="test.topic") public void subscribe3(String msg) { System.out.println("消息订阅者3:"+msg); } }
7、contoller中增加发送消息接口
@Autowired private PublishService publishService; @GetMapping("topic") public String topic(String msg) { publishService.publish(msg); return "send topic msg"; }
8、访问http://localhost:8080/msg/topic?msg=12468487,控制台输出,说明订阅成功
9、这时发现向queue中写入数据后,消息消费者没有输出了,这时因为activemq默认只支持点对点模式,更改配置文件后又仅支持发布/订阅模式。要同时支持两种模式,就需要为topic定义独立的JmsListenerContainer
10、在Application中增加代码
@Bean public JmsListenerContainerFactory<?> jmsListenerContainerTopic() { DefaultJmsListenerContainerFactory bean = new DefaultJmsListenerContainerFactory(); bean.setPubSubDomain(true); bean.setConnectionFactory(new ActiveMQConnectionFactory()); return bean; }
11、在TopicSubscribe的@JmsListener注解中增加containerFactory设置,去掉配置文件中的spring.jms.pub-sub-domain=true,这时就可以实现两种模式同时使用了,我们更改一下TopicSubscribe
/** * */ package com.zc.app.test.jms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; /** * 订阅者 * */ @Component public class TopicSubscribe { @JmsListener(destination="test.topic",containerFactory="jmsListenerContainerTopic") public void ubscribe1(String msg) { System.out.println("消息订阅者1:"+msg); } @JmsListener(destination="test.topic",containerFactory="jmsListenerContainerTopic") public void ubscribe2(String msg) { System.out.println("消息订阅者2:"+msg); } @JmsListener(destination="test.topic") public void subscribe3(String msg) { System.out.println("消息订阅者3:"+msg); } }
12、再次访问http://localhost:8080/msg/topic?msg=12468487,发现只有订阅者1、2输出了消息,同时queue的消费者也可以收到消息了。
原文链接:https://www.cnblogs.com/codingstudy/p/10303993.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:有关JVM文章和内存的相关文章
下一篇:【JVM】问题排查
- springboot2配置JavaMelody与springMVC配置JavaMelody 2020-06-11
- 学习Java 8 Stream Api (4) - Stream 终端操作之 collect 2020-06-11
- java学习之第一天 2020-06-11
- Java学习之第二天 2020-06-11
- SpringBoot 2.3 整合最新版 ShardingJdbc + Druid + MyBatis 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash