新鲜出炉,这是全网讲的最详细的springboot整合消息服务了吧,建议收藏!
springboot整合activeMq
ActiveMq是Apache提供的开源消息系统采用java实现,
很好地支持JMS(Java Message Service,即Java消息服务) 规范
ActiveMq安装:http://activemq.apache.org/components/classic/download/ 在官网下载安装对应的版本
下载完成后解压就可以使用
ActiveMq默认的端口号是8161,用户名和密码都是admin 在本机可以使用http://localhost:8161去访问
springboot整合ActiveMq
1、导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
2、在properties文件中配置activeMq
spring.activemq.broker-url=tcp://localhost:61616
#如果是点对点(queue),那么此处默认应该是false,如果发布订阅,那么一定设置为true
spring.activemq.packages.trust-all=true
spring.activemq.user=admin
spring.activemq.password=admin
3、编写queue(队列)
@Component
public class QueueBean{
//创建一个队列实例
@Bean
Queue queue(){
//这里设置的消息是队列的名称
return new ActiveMQQueue("hello.javaboy");
}
}
4、创建消息的发送者以及消费者
@Component
public class JmsComponent{
//springboot提供的消息模板
@Autowired
JmsMessagingTemplate jmsMessagingTemplate;
//自己创建的队列实例
@Autowired
Queue queue;
/**
* 发送消息
* @param message
*/
public void send(Message message){
jmsMessagingTemplate.convertAndSend(this.queue,message);
}
/**
* 接收消息
* @param message
*/
//表示监听该队列名称发来的消息
@JmsListener(destination = "hello.javaboy")
public void readMessage(Message message){
System.out.println(message);
}
}
5、上述Message实体类
public class Message implements Serializable {
private String content;//消息主体
private Date sendDate;//消息发送的时间
//省略get、set、tostring方法
}
6、进行消息的发送以及消费
在测试类中注入JmsComponent 调用send()方法进行消息的转发
@SpringBootTest
class ActivemqApplicationTests {
@Autowired
JmsComponent jmsComponent;
@Test
void contextLoads() {
Message message = new Message();
message.setContent("hello activeMq");
message.setSendDate(new Date());
jmsComponent.send(message);
}
}
首先启动项目,在运行测试类进行消息发送:
控制台会打印消息内容:

springboot整合RabbitMQ
rabbitmq安装比较繁琐,这里使用docker容器进行安装,docker安装非常方便,一条命令全部搞定
通过docker安装rabbitmq
-P(大p)表示自动映射到主机端口
docker run -d --hostname my-rabbitmq --name some-rabbitmq -P rabbitmq:3-management
首先导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
编写配置文件:
#配置rabbitMQ
spring.rabbitmq.host=localhost
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
spring.rabbitmq.port=32771
RabbitMQ 四种交换模式:
直连交换机:Direct exchange
扇形交换机:Fanout exchange
主体交换机:Topic exchange
首部交换机:Headers exchange
下面分别介绍4中交换模式:
1、Direct exchange
//Direct策略(只转发给routingKey相匹配的用户)
@Configuration
public class RabbitDirectConfig {
public final static String DIRECTNAME = "javaboy-direct";
//消息队列
@Bean
Queue queue(){
//name值为队列名称,routingKey会与他进行匹配
return new Queue("hello.RabbitMQ");
}
@Bean
Queue queue1(){
return new Queue("hello.RabbitMQ1");
}
@Bean
DirectExchange directExchange(){
//第一个参数为DIRECTNAME、第二个参数表示重启后是否有效,第三参数表示长时间未使用是否删除
return new DirectExchange(DIRECTNAME,true,false);
}
@Bean
Binding binding(){
//将队列queue和DirectExchange绑定在一起
return BindingBuilder.bind(queue()).to(directExchange()).with("direct");
}
@Bean
Binding binding1(){
//将队列queue和DirectExchange绑定在一起
return BindingBuilder.bind(queue1()).to(directExchange()).with("direct");
}
}
2、配置消费者DirectReceiver:
//配置消费者
@Component
public class DirectReceiver {
//只监听queue()队列的消息
@RabbitListener(queues = "hello.RabbitMQ")
public void hanlder(String msg){
System.out.println("hanlder>>>"+msg);
}
//只监听queue1()队列的消息
@RabbitListener(queues = "hello.RabbitMQ1")
public void hanlder1(String msg){
System.out.println("hanlder1>>>"+msg);
}
}
测试代码:
在springboot的测试类中注入RabbitTemplate(springboot提供的RabbitMQ模板)
@Autowired
RabbitTemplate rabbitTemplate;
@Test
void contextLoads() {
//两个参数第一个是routingKey、第二个为消息内容
rabbitTemplate.convertAndSend("hello.RabbitMQ","hello RabbitMQ test");
rabbitTemplate.convertAndSend("hello.RabbitMQ1","hello RabbitMQ test222");
}
启动项目后,运行测试类可以看到只有与routingkey相匹配的消费者受到了对应的消息:
2、Fanout exchange
Fanout策略(只要是与他绑定的队列,都会收到消息与routingKey无关)
1、配置RabbitFanoutConfig:
//Fanout策略(只要是与他绑定的队列,都会收到消息与routingKey无关)
@Configuration
public class RabbitFanoutConfig {
public final static String FANOUTNAME = "javaboy-fanout";
//配置了两个消息队列queueOne和queueTwo
@Bean
Queue queueOne(){
return new Queue("queue-one");
}
@Bean
Queue queueTwo(){
return new Queue("queue-two");
}
@Bean
FanoutExchange fanoutExchange(){
return new FanoutExchange(FANOUTNAME,true,false);
}
//将两个队列与FanoutExchange绑定
@Bean
Binding bindingOne(){
return BindingBuilder.bind(queueOne()).to(fanoutExchange());
}
@Bean
Binding bindingTwo(){
return BindingBuilder.bind(queueTwo()).to(fanoutExchange());
}
}
2、配置消费者FanoutReceiver:
//配置消费者
@Component
public class FanoutReceiver {
//两个消费者分别监听两个不同的队列
@RabbitListener(queues = "queue-one")
public void hanlder1(String msg){
System.out.println("FanoutReceiver:hanlder1>>>"+msg);
}
@RabbitListener(queues = "queue-two")
public void hanlder2(String msg){
System.out.println("FanoutReceiver:hanlder2>>>"+msg);
}
}
3、测试类:
@Test
void rabbitFanout(){
//三个参数表示RabbitFanoutConfig的名称、routingkey、消息内容
rabbitTemplate.convertAndSend(RabbitFanoutConfig.FANOUTNAME,null,"hello fanout test");
}
该方式与routingkey无关所有写null即可
查看输出:可以看到两个消费者都收到了消息

3、Topic exchange
topic策略可以根据routingKey的规则(通配符方式)进行去匹配队列进行转发规则为.#. *为单词,#表示模糊匹配
例如routingkey为:xiaomi.# 那么带有xiaomi.开头的队列都会收到该消息
routingkey为:#.phone.# 表示消息的routingKey中带有phone时 就会去匹配带有phone的队列
1、配置RabbitTopicConfig:
/topic策略可以根据routingKey的规则(通配符方式)进行去匹配队列进行转发规则为*.#.*
//*为单词,#表示模糊匹配
@Configuration
public class RabbitTopicConfig {
public final static String TOPICNAME = "javaboy-topic";
@Bean
TopicExchange topicExchange(){
return new TopicExchange(TOPICNAME,true,false);
}
@Bean
Queue xiaomi(){
return new Queue("xiaomi");
}
@Bean
Queue huawei(){
return new Queue("huawei");
}
@Bean
Queue phone(){
return new Queue("phone");
}
@Bean
Binding xiaomiBinding(){
//xiaomi.#:表示消息的routingKey是以xiaomi开头的就会路由到xiaomi的队列
return BindingBuilder.bind(xiaomi()).to(topicExchange()).with("xiaomi.#");
}
@Bean
Binding huaweiBinding(){
return BindingBuilder.bind(huawei()).to(topicExchange()).with("huawei.#");
}
@Bean
Binding phoneBinding(){
//#.phone.#:表示消息的routingKey中带phone的都会路由到phone的队列
return BindingBuilder.bind(phone()).to(topicExchange()).with("#.phone.#");
}
}
2、配置消费者TopicReceiver:
@Component
public class TopicReceiver {
//分别监听名称为xiaomi、huawei、phone的队列
@RabbitListener(queues = "xiaomi")
public void handlerXM(String msg){
System.out.println("TopicReceiver:handlerXM>>>"+msg);
}
@RabbitListener(queues = "huawei")
public void handlerHW(String msg){
System.out.println("TopicReceiver:handlerHW>>>"+msg);
}
@RabbitListener(queues = "phone")
public void handlerPHONE(String msg){
System.out.println("TopicReceiver:handlerPHONE>>>"+msg);
}
}
3、测试类:
@Test
void rabbitTopic(){
//根据匹配规则该消息只能被xiaomi的队列收到
rabbitTemplate.convertAndSend(RabbitTopicConfig.TOPICNAME,"xiaomi.news","小米新闻");
//根据匹配规则该消息只能被phone的队列收到
rabbitTemplate.convertAndSend(RabbitTopicConfig.TOPICNAME,"vivo.phone","vivo手机");
//根据匹配规则该消息可以别huawei和phone两个队列收到
rabbitTemplate.convertAndSend(RabbitTopicConfig.TOPICNAME,"huawei.phone","华为手机");
}
查看输出:


可以看到routingkey为huawei.phone的消息匹配了两个队列,其他两个都只匹配了一个队列
4、Headers exchange
该模式是根据路由规则的header进行匹配的,在进行匹配的时候需要传入一个map集合,routingkey去匹配map即可中的key value,匹配规则可以使any或者all,any表示只要包含任意信息就可以,all表示所有信息都必须匹配
1、配置RabbitHeaderConfig:
@Configuration
public class RabbitHeaderConfig {
public final static String HEADERNAME = "javaboy-header";
@Bean
HeadersExchange headersExchange(){
return new HeadersExchange(HEADERNAME,true,false);
}
//分别创建两个不同header的队列
@Bean
Queue queueName(){
return new Queue("name-queue");
}
@Bean
Queue queueAge(){
return new Queue("age-queue");
}
@Bean
Binding bindingName(){
Map<String,Object> map = new HashMap<>();
map.put("name","hello");
//表示如果routingKey匹配的map集合中的key value 就会将消息转发到对应的路由上
return BindingBuilder.bind(queueName()).to(headersExchange()).whereAny(map).match();
}
@Bean
Binding bindingAge(){
return BindingBuilder.bind(queueAge()).to(headersExchange()).where("age").exists();
}
}
2、创建消费者HeaderReceiver:
@Component
public class HeaderReceiver {
@RabbitListener(queues = "name-queue")
public void handlerName(byte[] msg){
System.out.println("HeaderReceiver:handlerName>>>>"+new String(msg,0,msg.length));
}
@RabbitListener(queues = "age-queue")
public void handlerAge(byte[] msg){
System.out.println("HeaderReceiver:handlerAge>>>>"+new String(msg,0,msg.length));
}
}
3、测试代码:
@Test
public void rabbitHeader(){
//设置消息,并且设置header,setHeader("name","hello")分别表示map集合中的key、value
Message nameMessage =
MessageBuilder.withBody("hello name".getBytes()).setHeader("name","hello").build();
Message ageMessage =
MessageBuilder.withBody("hello 99 age".getBytes()).setHeader("age","99").build();
rabbitTemplate.send(RabbitHeaderConfig.HEADERNAME,null,nameMessage);
rabbitTemplate.send(RabbitHeaderConfig.HEADERNAME,null,ageMessage);
}
查看输出:

改变setheader中的值查看结果:
Message nameMessage =
MessageBuilder.withBody("hello name".getBytes()).setHeader("name","javaboy").build();
可以看到因为key、value匹配不上只打印了一条消息。

最后
大家看完有什么不懂的可以在下方留言讨论,也可以关注我私信问我,我看到后都会回答的。也欢迎大家关注我的公众号:前程有光,金三银四跳槽面试季,整理了1000多道将近500多页pdf文档的Java面试题资料,文章都会在里面更新,整理的资料也会放在里面。谢谢你的观看,觉得文章对你有帮助的话记得关注我点个赞支持一下!
新鲜出炉,这是全网讲的最详细的springboot整合消息服务了吧,建议收藏!的更多相关文章
- 微信小程序开发视频教程新鲜出炉
微信小程序开发公测了,可是对于新手来说,不同的框架不同的开发机制,如何快速适应呢?微信小程序开发视频教程新鲜出炉了,从零开始一步一步搭建微信小程序,每个章节都会涉及到不同的知识点,等教程学习完你不但掌 ...
- 刚写完的商城erp + 这个商城前台,新鲜出炉。自己1个人写, 包括php框架和前端html页面.
刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面. 刚写完的商城erp + 这个商城前台,新鲜出炉.自己1个人写, 包括php框架和前端html页面.
- 23套新鲜出炉的网站和手机界面 PSD 素材
Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这些套件让他们使用快速和有效的方式复制用户界面.这些类型的工具包提供了一个基本的用户界面元素,用于它们需要制作的网站或软件模型. 在这篇文章 ...
- 22套新鲜出炉的 Web & Mobile PSD 用户界面素材
在这篇文章中,我们展示的是自由和清新的 UI 设计素材套件.这些线框图和 UI 设计工具包让设计师在设计用户界面原型的时候能够非常便利. Web 用户界面,移动用户界面和线框套件对设计师很有用,因为这 ...
- 20个新鲜出炉的网站模板【HTML & PSD】
这里给大家分享20 个新鲜出炉的免费网站模板.这些设计元素将成为你下一个项目的重要素材,可以帮你节省很多的时间.与往常一样,我们经常漫游网络,寻找最好的资源, HTML.CSS 和 PSD 等等,记得 ...
- 分享25个新鲜出炉的 Photoshop 高级教程
网络上众多优秀的 Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享25个新鲜出炉的 Photoshop 高级教程,提高你的设计技巧,制作时尚的图片效果.这 ...
- PS教程:20个新鲜出炉的 Photoshop 中级教程
Photoshop 实例教程是提高 Photoshop 技能的最佳学习途径.今天,我向大家分享最新20个 Photoshop 进阶教程,提高你的图片处理技巧,制作时尚的效果.这些教程可以帮助把你的想法 ...
- Onsen UI – 新鲜出炉的 PhoneGap 界面框架
Onsen UI 是一个基于元素自定义的 HTML5 UI 框架,用于构建你的移动前端.这个一个基于 Web 组件的概念的框架,让构建应用程序变得更加轻松.Onsen UI 专门针对 PhoneGap ...
- 20套新鲜出炉的免费 PSD 格式的图标《免费下载》
在网页设计中,设计师专注于每一个领域的设计,包括颜色选择.图标.创造力.混色等.正确的选择图标可以使他们的设计脱颖而出,看起来令人震惊.在 Web 设计领域,图标发挥非常重要的作用,因为美丽的和创造性 ...
随机推荐
- linux修改环境变量后无法登录
在登陆界面按Ctrl+Alt+F1(F1~F6), 进入 tty 后登陆账号. 执行以下命令: /usr/bin/sudo /usr/bin/vi /etc/environment 将PATH的值复原 ...
- WSL2 + Docker + IDEA 开发到发布一步到位
摘要:本文主要介绍了如何用WSL2.Docker.IDEA将Java应用从开发到发布一步到位. 上次介绍了如何在Windows(WSL2) Linux子系统中搭建搭建Docker环境,这次将利用上次搭 ...
- HBase基础理论知识
来源:第四章:大数据 の HBase 基础 本课主题 NoSQL 数据库介绍 HBase 基本操作 HBase 集群架构与设计介紹 HBase 与HDFS的关系 HBase 数据拆分和紧缩 引言 ...
- sqlServer数据库中的日期转换
今天开发过程中涉及到 sqlServer数据库数据同步至mysql数据,所以对日期格式转换需求,查到了一些关于sqlServer 的日期转换内容: 一般存入数据库中的时间格式为yyyy-mm-ddhh ...
- java数据结构-08队列
一.什么是队列 队列是一种特殊的线性表,只能在头尾两端进行操作,特点是先进先出:就像排队买票一样,先来的先买 二.接口设计 三.代码实现 可以使用动态数组.链表等实现:这里两种实现栈与双向链表 1. ...
- LoadRunner11web压力测试录制、回放、负载前的准备
以前都是利用LoadRunner进行接口测试.自动化测试.压力测试.最近要对web系统做录制压测,因此花费了很长时间来研究这方面的工作.以下是我web端录制.压测过程的流程以及遇到的坑. 一.启动Vi ...
- LuoguP3602 Koishi Loves Segments
题面 n个区间和数轴上的m个关键点 (0<=n,m<=4*1e5,数轴范围 \(-1^7\) ~ \(1^7\))每个关键点有被区间区间覆盖的次数上限,求最多能放多少个区间到数轴上 传送门 ...
- pycharm配置django rest framework
安装django rest framework pip install 添加rest_framework app 在settings.py INSTALLED_APPS = [ 'django.co ...
- 机器学习 第5篇:knn回归
基于最邻近算法的分类,本质上是对离散的数据标签进行预测,实际上,最邻近算法也可以用于对连续的数据标签进行预测,这种方法叫做基于最邻近数据的回归,预测的值(即数据的标签)是连续值,通过计算数据点最临近数 ...
- 基于Django的图书推荐系统和论坛
基于Django的图书推荐系统和论坛 关注公众号"轻松学编程"回复"图书系统"获取源码 一.基本功能 登录注册页面 基于协同过滤的图书的分类,排序,搜索,打分功 ...