springboot rocket 多个生产者_Springboot整合RabbitMQ

大家好,我是润森。期末已挂,又有时间写笔记。

11912d6a4374dce68559c5a79e3f52e5.png

MQ

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。MQ是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。

RabbitMQ

957598fa10969e62df0cf8dc202d6ca0.png

RabbitMQ是一个遵循AMQP协议的消息中间件,它从生产者接受消息并传递给消费者,在这和过程中,根据路由规则就行路由、缓存和持久化。

docker 搭建RabbitMQ

docker pull rabbitmq:management (镜像配有控制台)# 创建容器docker run -d -p 5672:5672 -p 15672;15672 --name myrabbitmq  rabbitmq:management

启动容器后,可以浏览器中访问http://localhost:15672来查看控制台信息。

RabbitMQ默认的用户名:guest,密码:guest

64d00ea9414930edfdef830c59763dde.png

RabbitMQ概念和理解

RabbitMQ有几个重要的概念:虚拟主机,交换机,队列和绑定

  • 虚拟主机:一个虚拟主机持有一组交换机、队列和绑定,我们可以从虚拟主机层面的颗粒度进行权限控制
  • 交换机:Exchange用于转发消息,它并不存储消息,如果没有Queue队列绑定到Exchange,它会直接丢弃掉生产者发来的数据。
  • 交换机还有个关联的重要概念:路由键,消息转发到哪个队列根据路由键决定
  • 绑定:就是绑定交换机和队列,它是多对多的关系,也就是说多个交换机可以绑同一个队列,也可以一个交换机绑多个队列

交换机有四种类型的模式Direct, topic, Headers and Fanout

94f2909fde46c6c0e1025e1e07a692ad.png
5b873d10552e052489b22ac8b959094b.png

这是队列和交换器的关系图93056db63669a051a9303a853c5e7064.png

ed60a3c12f93cb451b06ccbd810b7cae.png
66bc9dc9ffb262f39f47fb7d2148f06e.png
22ebfae1d9751b3cfd6bceda376f3259.png
53a422005fd2568d38dadf9ddc73f72b.png

这就是它们区别

fanout:把所有发送到该Exchange的消息投递到所有与它绑定的队列中。

direct:把消息投递到那些binding key与routing key完全匹配的队列中。

topic:将消息路由到binding key与routing key模式匹配的队列中。

系统架构

b0c8b60ff0657b7e46eb68ac43f7dcdf.png

spring整合Rabbitmq

pom.xml引进spring-boot-starter-amqp

     org.springframework.boot     spring-boot-starter-amqp
application.properties配置文件
spring.rabbitmq.host=ipspring.rabbitmq.username=guestspring.rabbitmq.password=guest

DemoRabbitmqApplicationTests测试类

使用的是单播原则

@SpringBootTestclass DemoRabbitmqApplicationTests {    @Autowired    RabbitTemplate rabbitTemplate;    @Autowired    AmqpAdmin amqpAdmin;    @Test    void contextLoads() {        //Message需要自己构造一个;定义消息体内容和消息头        //rabbitTemplate.send(exchage,routeKey,message);        //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq;        //rabbitTemplate.convertAndSend(exchage,routeKey,object);        Map map = new HashMap<>();        map.put("msg", "这是第一个消息");        map.put("data", Arrays.asList("helloworld", 123, true));        System.out.println(map.toString());        rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", map);        System.out.println("消息发送出去");    }    //接受数据,如何将数据自动的转为json发送出去    @Test    void receive() {        Object o = rabbitTemplate.receiveAndConvert("atguigu.news");        System.out.println(o.getClass());        System.out.println(o);    }}
79a98ea6853d12ad9ac1e5625c18e6e5.png

atguigu.news队列中查看对应的数据a65ad4453bdc25d75ac6dce73c1bb297.png

382a36015bbecbe9959dcb410021eebd.png

如何将网页端的输出atguigu.news队列数据转化成json序列化,就要自定义MyAMQPConfig

在config文件夹中,新建MyAMQPConfig

34716b24c9beb359395e2c759de514df.png
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;import org.springframework.amqp.support.converter.MessageConverter;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/** * @author: 毛利 */@Configurationpublic class MyAMQPConfig {    @Bean    public MessageConverter messageConverter() {        return new Jackson2JsonMessageConverter();    }}

messageConverter换为Jackson2JsonMessageConverter,再测试运行

0314e6e58afc9e934a96fa1f7b575bdb.png

spring传递Bean对象

传递Book对象到Rabbitmq

71ea6f5193859e3265cda1380206751f.png

新建bean文件Book对象,一个bookName一个author类变量

ALT+INS补充tostring,Constructor有无参构造器,Getter和Setter

package com.example.demorabbitmq.Bean;/** * @author: 毛利 */public class Book {    private String bookName;    private String author;    public Book() {    }    public Book(String bookName, String author) {        this.bookName = bookName;        this.author = author;    }    public String getBookName() {        return bookName;    }    @Override    public String toString() {        return "Book{" +                "bookName='" + bookName + '\'' +                ", author='" + author + '\'' +                '}';    }    public void setBookName(String bookName) {        this.bookName = bookName;    }    public String getAuthor() {        return author;    }    public void setAuthor(String author) {        this.author = author;    }}

DemoRabbitmqApplicationTests测试类 rabbitTemplate.convertAndSend传递Book("西游记","吴承恩"))

@Testvoid contextLoads() {    //Message需要自己构造一个;定义消息体内容和消息头    //rabbitTemplate.send(exchage,routeKey,message);    //object默认当成消息体,只需要传入要发送的对象,自动序列化发送给rabbitmq;    //rabbitTemplate.convertAndSend(exchage,routeKey,object);    Map map = new HashMap<>();    map.put("msg", "这是第一个消息");    map.put("data", Arrays.asList("helloworld", 123, true));//        System.out.println(map.toString());    rabbitTemplate.convertAndSend("exchange.direct", "atguigu.news", new Book("西游记","吴承恩"));    System.out.println("消息发送出去");}

测试运行

4646a264ca4bfab6faa4e6ac4465640e.png

补充广播fanout

Exchange之fanout交换器(广播)

 @Test public void sendMsg() {     rabbitTemplate.convertAndSend("exchange.fanout", "", new Book("红楼梦", "曹雪芹")); }
cd500edec389a28370b0dffba6a7ea55.png

总结

RabbitMQ 本文使用Docker搭建RabbitMQ,使用Springboot传递消息到RabbitMQ,通过自定义RabbitMQ,将消息改为json序列。希望以上对你学习有用

再自我介绍一下吧。我叫润森,是一个的学习者。

79164398760c6e491bbf29c0fca5a531.png

                                ----------  END  ----------

重磅!全网vip电影免费看功能已上线!

主页搜索电影名字即可观看vip免费电影( 搜索功能目前正在备案,用的是网上的免费链接,会存在不适的广告,建议使用电脑使用搜索功能或者使用小程序进行观影),或点击下方菜单栏哈克精选,即可打开小程序进行观影!                                    

d386672cfa2738adb1c28072f50d5af5.png

推荐阅读

• 内部泄露版!大厂的最新薪资和职级一览

• 聊聊非科班学IT

• 自用神级超级牛逼 15款 IntelliJ IDEA插件

• springboot中的cache(三)

如有收获,点个在看,诚挚感谢 cc42f840eaded1114610045dce1b5ed7.png下次见(。・ω・。)
在 Spring Boot 中使用 RocketMQ,一个 Consumer Group 可以订阅多个 Topic。以下是如何在 Spring Boot 中配置一个 Consumer Group 订阅多个 Topic 的步骤: 1. 创建 Consumer Group:在 Spring Boot 项目中,可以通过在配置文件(如 application.properties 或 application.yml)中配置 Consumer Group 来创建 Consumer Group。例如,在 application.properties 中添加以下配置: ``` rocketmq.consumer.group=myGroup ``` 2. 订阅多个 Topic:在 Spring Boot 项目中,可以通过在配置文件中配置多个 Topic 来订阅多个 Topic。例如,在 application.properties 中添加以下配置: ``` rocketmq.consumer.topics=topic1,topic2,topic3 ``` 3. 创建 Consumer:在 Spring Boot 项目中,可以使用 RocketMQ 的 Spring Boot Starter 来创建 Consumer。首先需要在 pom.xml 文件中添加以下依赖: ``` <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-spring-boot-starter</artifactId> <version>${rocketmq.version}</version> </dependency> ``` 然后,在 Spring Boot 项目中创建一个 RocketMQ 的 Consumer 类,用于处理消息。例如: ``` @Component @RocketMQMessageListener(consumerGroup = "${rocketmq.consumer.group}", topic = "${rocketmq.consumer.topics}") public class MyConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { // 处理消息 } } ``` 在上面的示例中,使用 `@RocketMQMessageListener` 注解来标识这是一个 RocketMQ 的 Consumer 类,并且配置 Consumer Group 和 Topic。然后,实现 `RocketMQListener` 接口来处理消息。 通过以上步骤,就可以在 Spring Boot 中配置一个 Consumer Group 订阅多个 Topic 了。需要注意的是,RocketMQ 的配置方法可能会随着版本的升级而有所改变,具体的操作步骤需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值