springboot 学习笔记(八)
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);
}
PublishService
/**
*
*/
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);
} }
PublishServiceImpl
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);
}
}
TopicSubscribe
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);
}
}
TopicSubscribe
12、再次访问http://localhost:8080/msg/topic?msg=12468487,发现只有订阅者1、2输出了消息,同时queue的消费者也可以收到消息了。

springboot 学习笔记(八)的更多相关文章
- SpringBoot学习笔记
SpringBoot个人感觉比SpringMVC还要好用的一个框架,很多注解配置可以非常灵活的在代码中运用起来: springBoot学习笔记: .一.aop: 新建一个类HttpAspect,类上添 ...
- Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Springboot学习笔记(六)-配置化注入
前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...
- python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑
python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...
- Go语言学习笔记八: 数组
Go语言学习笔记八: 数组 数组地球人都知道.所以只说说Go语言的特殊(奇葩)写法. 我一直在想一个人参与了两种语言的设计,但是最后两种语言的语法差异这么大.这是自己否定自己么,为什么不与之前统一一下 ...
- SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用
SpringBoot学习笔记(14):使用SpringBootAdmin管理监控你的应用 Spring Boot Admin是一个管理和监控Spring Boot应用程序的应用程序.本文参考文档: 官 ...
- SpringBoot学习笔记(3):静态资源处理
SpringBoot学习笔记(3):静态资源处理 在web开发中,静态资源的访问是必不可少的,如:Html.图片.js.css 等资源的访问. Spring Boot 对静态资源访问提供了很好的支持, ...
- SpringBoot学习笔记(2):引入Spring Security
SpringBoot学习笔记(2):用Spring Security来保护你的应用 快速开始 本指南将引导您完成使用受Spring Security保护的资源创建简单Web应用程序的过程. 参考资料: ...
- SpringBoot学习笔记(7):Druid使用心得
SpringBoot学习笔记(7):Druid使用心得 快速开始 添加依赖 <dependency> <groupId>com.alibaba</groupId> ...
- SpringBoot学习笔记(4):与前端交互的日期格式
SpringBoot学习笔记(4):与前端交互的日期格式 后端模型Date字段解析String 我们从前端传回来表单的数据,当涉及时间.日期等值时,后端的模型需将其转换为对应的Date类型等. 我们可 ...
随机推荐
- web安全之XSS和CSRF
XSS 跨站脚本攻击(cross site script),本来缩写CSS单位了和层叠样式(Cascading Style Sheet,CSS)有所区别,所以在安全领域叫做“XSS”. XSS攻击,通 ...
- day02 秘钥生成,免密访问命令
hadoop免密登陆: 生成秘钥: ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa cat ~/.ssh/id_dsa.pub >> ~/.ssh/aut ...
- JavaScript学习系列7 -- JavaScript中的运算符
今天,我们来说一说JavaScript中的运算符,首先我们来讲一讲 一元运算符 JavaScript中的一元运算符有以下几种 1. delete delete 运算符主要用于删除对以前定义的对象属性或 ...
- 16. 再说 WAF 绕过
1,大小写混排 这可以算最容易想到的方式了.大小写绕过用于只针对小写或大写的关键字匹配技术,正则表达式 /express/i 大小写不敏感即无法绕过,这是最简单的绕过技术. 举例: z.com/ind ...
- 诺基亚 920T - 我的非凡系列手机始终显示旋转齿轮而无响应,我该如何让手机停止显示旋转齿轮?
有时,在 OTA 更新 (或重置手机) 后,设备可能始终显示“旋转齿轮”而无响应. 如果“旋转齿轮”在屏幕上显示的时间超过 60 分钟,则需要执行恢复操作. 您可以尝试下面这些简单的解决方法: 按住电 ...
- hdu1055
#include<iostream> #include<iomanip> #include<cstdio> #include<cstring> #inc ...
- hdu1048
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;int main( ...
- MAC电脑下Pycharm新建模板默认添加作者时间等信息
在pycharm使用过程中,对于每次新建文件的shebang行和关于代码编写者的一些个人信息快捷填写,使用模板的方式比较方便. 方法如下: 1.打开pycharm,选择Pycharm-preferen ...
- 洛谷P3043 [USACO12JAN]牛联盟Bovine Alliance
P3043 [USACO12JAN]牛联盟Bovine Alliance 题目描述 Bessie and her bovine pals from nearby farms have finally ...
- Jmeter中JDBC Request和BeanShell PostProcessor的结合使用(SQL模糊查询)
[前言] 今天记录一下Jmeter中JDBC Request和BeanShell PostProcessor的结合使用的方法(SQL模糊查询) [步骤] 1.下载对应数据库的驱动包到jmeter安装目 ...