【RabbitMQ】SpringBoot整合RabbitMQ

news/2024/10/18 6:03:05/

文章目录

  • 搭建初始环境
    • 引入依赖
    • 配置配置文件
  • HelloWorld模型使用
  • Work模型使用
  • Fanout 广播模型
  • Route 路由模型
  • Topic 订阅模型(动态路由模型)

搭建初始环境

引入依赖

<!--引入与rabbitmq集成依赖-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

这个地方我们也可以在快速构建的时候直接勾选;
在这里插入图片描述

配置配置文件

spring:application:name: springboot_rabbitmqrabbitmq:host: 10.15.0.9port: 5672username: emspassword: 123virtual-host: /ems

这个name没有什么实际的意义,但在微服务项目中至关重要
rabbitmq中的配置是为了与我们RabbitMQ的服务进行连接

RabbitTemplate 用来简化操作 使用时候直接在项目中注入即可使用

HelloWorld模型使用

开发生产者

@Autowired
private RabbitTemplate rabbitTemplate;@Test
public void testHello(){rabbitTemplate.convertAndSend("hello","hello world");
}

convertAndSend方法:转化与发送。它是用来将消息转化为byte然后再发送

  • 第一个参数:队列的名称
  • 第二个参数:消息的内容

我们运行生产者之后发现是没有队列的:
在这里插入图片描述
因为这个队列的创建并不是在生产者这边创建的而是在消费者那边创建的

如果没有消费者的话创建一个队列是没有任何意义的

开发消费者

@Component
@RabbitListener(queuesToDeclare = @Queue("hello"))
public class HelloCustomer {@RabbitHandlerpublic void receive1(String message){System.out.println("message = " + message);}
}

消费者必须有一个注解@RabbitListener代表消费者监听。此时我们希望他去接收hello队列中的消息,但是这个队列还没有,所以我们这里使用queuesToDeclare 的方式去声明一个队列。

然后我们怎么去拿到队列里面的消息呢?我们可以任意创建一个方法在它上面使用@RabbitHandler注解,代表从队列中取出消息的回调方法,我们可以通过这个回调方法的参数拿到消息。

然后我们运行发现:
在这里插入图片描述
这种模式下创建的队列默认就是持久化的,那么我们怎么设置他的是否独占是否自动删除呢?

我们可以利用 @Queue注解:
在这里插入图片描述

默认创建的队列是持久化、非独占,不自动删除的。

Work模型使用

开发生产者

@Autowired
private RabbitTemplate rabbitTemplate;@Test
public void testWork(){for (int i = 0; i < 10; i++) {rabbitTemplate.convertAndSend("work","hello work!");}
}

开发消费者

@Component
public class WorkCustomer {@RabbitListener(queuesToDeclare = @Queue("work"))public void receive1(String message){System.out.println("work message1 = " + message);}@RabbitListener(queuesToDeclare = @Queue("work"))public void receive2(String message){System.out.println("work message2 = " + message);}
}

我们这里是在一个类中构建多个消费者,前面@RabbitListener是在类上用的,@RabbitListener也可以用在方法上

说明:默认在Spring AMQP实现中Work这种方式就是公平调度,如果需要实现能者多劳需要额外配置

Fanout 广播模型

开发生产者

@Autowired
private RabbitTemplate rabbitTemplate;@Test
public void testFanout() throws InterruptedException {rabbitTemplate.convertAndSend("logs","","这是日志广播");
}

convertAndSend:

  • 第一个参数:交换机的名称
  • 第二个参数:routingkey
  • 第三个参数:产生的消息

同样交换机并不是在生产者中定义而是在消费者中去定义,只执行上述代码是不会创建logs的交换机的

开发消费者

@Component
public class FanoutCustomer {@RabbitListener(bindings = @QueueBinding(value = @Queue,  //创建临时队列exchange = @Exchange(name="logs",type = "fanout")  //绑定的交换机))public void receive1(String message){System.out.println("message1 = " + message);}@RabbitListener(bindings = @QueueBinding(value = @Queue, //创建临时队列exchange = @Exchange(name="logs",type = "fanout")  //绑定交换机类型))public void receive2(String message){System.out.println("message2 = " + message);}
}

Route 路由模型

开发生产者

@Autowired
private RabbitTemplate rabbitTemplate;@Test
public void testDirect(){rabbitTemplate.convertAndSend("directs","error","error 的日志信息");
}

开发消费者

@Component
public class DirectCustomer {@RabbitListener(bindings ={@QueueBinding(value = @Queue(),key={"info","error"},exchange = @Exchange(type = "direct",name="directs"))})public void receive1(String message){System.out.println("message1 = " + message);}@RabbitListener(bindings ={@QueueBinding(value = @Queue(),key={"error"},exchange = @Exchange(type = "direct",name="directs"))})public void receive2(String message){System.out.println("message2 = " + message);}
}

Topic 订阅模型(动态路由模型)

开发生产者

@Autowired
private RabbitTemplate rabbitTemplate;//topic
@Test
public void testTopic(){rabbitTemplate.convertAndSend("topics","user.save.findAll","user.save.findAll 的消息");
}

开发消费者

@Component
public class TopCustomer {@RabbitListener(bindings = {@QueueBinding(value = @Queue,key = {"user.*"},exchange = @Exchange(type = "topic",name = "topics"))})public void receive1(String message){System.out.println("message1 = " + message);}@RabbitListener(bindings = {@QueueBinding(value = @Queue,key = {"user.#"},exchange = @Exchange(type = "topic",name = "topics"))})public void receive2(String message){System.out.println("message2 = " + message);}
}


http://www.ppmy.cn/news/11212.html

相关文章

图像编辑Photoshop 2023中文新

Photoshop2023从照片编辑和合成到数字绘画、动画和图形设计-只要能想到&#xff0c;就能在Photoshop中创作出来。相信大家都有在用之前的版本&#xff0c;这款软件功能丰富&#xff0c;实用性很强&#xff0c;有着大量的功能用户都可以用上&#xff0c;不管是美化还是滤镜&…

JS的基础语法

作者&#xff1a;~小明学编程 文章专栏&#xff1a;JavaEE 格言&#xff1a;热爱编程的&#xff0c;终将被编程所厚爱。 目录 JavaScript的书写形式 行内式 内嵌式 外部式 注释 输入输出 输入 输出 JS的语法规则 变量 数据类型 数字类型 字符串类型 布尔类型 运算…

java8 第七章-----多线程

7.1、线程基本知识 进程与线程&#xff1a; 进程&#xff08;Process&#xff09;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代面向线程设计的计算机结构…

【Linux】缓冲区理解

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;缓冲区&am…

二、数据仓库模型设计

数据仓库模型设计一、数据模型二、关系模型三、维度模型1、事实表&#xff08;1&#xff09;事务事实表&#xff08;2&#xff09;周期快照事实表&#xff08;3&#xff09;累计快照事实表&#xff08;4&#xff09;无事实的事实表2、维度表3、维度模型类型&#xff08;1&#…

GAN Step By Step -- Step7 WGAN

GAN Step By Step 心血来潮 GSBS&#xff0c;顾名思义&#xff0c;我希望我自己能够一步一步的学习GAN。GAN 又名 生成对抗网络&#xff0c;是最近几年很热门的一种无监督算法&#xff0c;他能生成出非常逼真的照片&#xff0c;图像甚至视频。GAN是一个图像的全新的领域&#…

基于javaweb(springboot+mybatis)生活美食分享平台管理系统设计和实现以及文档报告

基于javaweb(springbootmybatis)生活美食分享平台管理系统设计和实现以及文档报告 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎…

RK3399平台开发系列讲解(CPU篇)CPUFreq 中央处理器频率调节技术

🚀返回专栏总目录 文章目录 一、CPUFreq组成二、设备树配置沉淀、分享、成长,让自己和他人都能有所收获!😄 📢中央处理器频率调节(Central Processing Unit frequency,CPUFreq)技术可以降低ARM芯片的功耗,例如在系统对任务压力较小时,通过调整处理器工作频率与输入…