SpringBoot整合RabbitMQ--Direct和Topic模式

news/2025/4/2 19:40:23/文章来源:https://www.cnblogs.com/5ran2yl/p/18799007

一.Direct模式

这几个模式使用SpringBoot的整合和前面使用源生Java整合其实是差不多的,故而步骤就不再详细赘述了,直接先导入依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.amqp</groupId><artifactId>spring-rabbit-test</artifactId><scope>test</scope>
</dependency>

 配置连接信息:

server:port: 9002spring:rabbitmq:username: adminpassword: adminvirtual-host: /host: 8.137.76.12port: 5672

 

direct业务类,负责发送有关routingkey = ‘qq’ 和 ‘sms’的队列

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.UUID;
@Service
public class DirectService {//注入rabbitMQ模板
    @Autowiredprivate RabbitTemplate rabbitTemplate;//定义交换机的名字private String exchangeName = "direct_order_exchange";//定义路由keyprivate String routingKey = "qq";//制造订单public void makeOrder(Long userID,Long productID,int num){String uuid = UUID.randomUUID().toString();System.out.println("用户:"+userID+",订单是:"+uuid);rabbitTemplate.convertAndSend(exchangeName,routingKey,uuid);rabbitTemplate.convertAndSend(exchangeName,"sms",uuid);}
}

 

注册交换机(拼接到springBoot整合fanout模式的配置类中的):

    @Beanpublic DirectExchange directExchange(){return new DirectExchange("direct_order_exchange",true,false);}//绑定关系,将交换机和队列进行绑定
    @Beanpublic Binding bindQue1(){return BindingBuilder.bind(qqQueue()).to(directExchange()).with("qq");}@Beanpublic Binding bindQue2(){return BindingBuilder.bind(WeChatQueue()).to(directExchange()).with("wechat");}@Beanpublic Binding bindQue3(){return BindingBuilder.bind(smsQueue()).to(directExchange()).with("sms");}

 

生产者测试方法:

    @AutowiredDirectService directService;@Testvoid dirctTest() throws InterruptedException {for (int i = 0; i < 5; i++) {Thread.sleep(1000);Long userId = 100L+ i;Long produceId = 10001L + i;int num = 10;directService.makeOrder(userId,produceId,num);}}

 

消费者和SpringBoot整合fanout模式一样,没有修改

启动测试:

生产者:

 消费者:

 二.Topic模式

 使用模糊匹配模式的代码都是差不多的,但是在绑定交换机上我们使用注解来绑定,而不是再使用配置类来绑定了

生产者:

@Service
public class TopicService {//注入rabbitMQ模板
    @Autowiredprivate RabbitTemplate rabbitTemplate;//定义交换机的名字private String exchangeName = "topic_order_exchange";//定义路由key//"#.qq"//"#.sms.#"//"*.wechat.#"private String routingKey = "sms.wechat.qq";//制造订单public void makeOrder(Long userID,Long productID,int num){String uuid = UUID.randomUUID().toString();System.out.println("用户:"+userID+",订单是:"+uuid);rabbitTemplate.convertAndSend(exchangeName,routingKey,uuid);}
}

 

声明一个交换机,和其队列,不需要再配配置类绑定,使用注解再消费者上直接绑定:

    //注册rabbitMQ队列
    @Beanpublic Queue qqQueue(){//队列的名称// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。//   return new Queue("TestDirectQueue",true,true,false);//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("qqQueue",true);}@Beanpublic Queue WeChatQueue(){//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("WeChatQueue",true);}@Beanpublic Queue smsQueue(){//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue("smsQueue",true);}//声明交换机    
@Bean
public TopicExchange topicExchange(){return new TopicExchange("topic_order_exchange",true,false);}

 

 测试方法:

@AutowiredTopicService topicService;@Testvoid topicTest() throws InterruptedException {for (int i = 0; i < 5; i++) {Thread.sleep(1000);Long userId = 100L+ i;Long produceId = 10001L + i;int num = 10;topicService.makeOrder(userId,produceId,num);}}

 

消费者,需要绑定交换机和当前队列的关系,以及指定路由Key

qq消费者:

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;@Component
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(// qqQueue 是队列名字,这个名字你可以自定随便定义。value = @Queue(value = "qqQueue",autoDelete = "false"),// topic_order_exchange 交换机的名字 必须和生产者保持一致exchange = @Exchange(value = "topic_order_exchange", type = ExchangeTypes.TOPIC),key = "#.qq"
))
public class QQConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("qq Direct----->"+message); // 打印接收到的消息
    }
}

 

 wechat消费者:

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;@Component
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(// WeChatQueue 是队列名字,这个名字你可以自定随便定义。value = @Queue(value = "WeChatQueue",autoDelete = "false"),// topic_order_exchange 交换机的名字 必须和生产者保持一致exchange = @Exchange(value = "topic_order_exchange", type = ExchangeTypes.TOPIC), // 这里是确定的rabbitmq模式是:TOPIC 是以广播模式 、 发布订阅模式key = "*.wechat.#"
))
public class WechatConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("wechat Direct----->"+message); // 打印接收到的消息
    }
}

 

sms消费者:

import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.*;
import org.springframework.stereotype.Component;@Component
// bindings其实就是用来确定队列和交换机绑定关系
@RabbitListener(bindings =@QueueBinding(// smsQueue 是队列名字,这个名字你可以自定随便定义。value = @Queue(value = "smsQueue",autoDelete = "false"),// topic_order_exchange 交换机的名字 必须和生产者保持一致exchange = @Exchange(value = "topic_order_exchange", type = ExchangeTypes.TOPIC),key = "#.sms.#"
))
public class smsConsumer {@RabbitHandlerpublic void  qqMsg(String message){System.out.println("sms Direct----->"+message); // 打印接收到的消息
    }
}

 

如上代码就是使用注解绑定交换机和队列的关系:

结果截图,生产者生产消息:

 消费者消费消息:

 如上使用Topic的模糊匹配将所有的路由key都匹配上了,故而所有队列都受到了。

 

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/907666.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMS和G1的区别

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔区别一:使用的范围不一样:CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用。 G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用区别二:STW的时间:CMS收集器以最小的停…

nfls 游记。

省流:三场模拟赛。rk1(2) rk3 rk4Day 1 3.26: 在前面的博客里面。 下午补了 noip2024 T1 。我怎么还是不会写????? Day 2 3.27: 没有模拟赛。组合数学专题。 写了一堆数学题。 中午逃离校园去吃了饭,终于有饭吃了!!!!111 晚上打了一场比赛,后三题全拼的暴力 /q…

PHP2 攻防世界

这题进去之后看到的:介绍该网站?gs,用f12,ctrl+u看都没看出啥。 看了别的博客才知道要看index.phps。第一次知道还有index.phps这个文件好像是扫描index.php的源代码啥的。操蛋 然后就看index.phps里的代码吧:这里看代码, `<?php if("admin"===$_GET[id]) {…

垃圾回收算法哪些阶段会STW

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔标记-复制算法应用在CMS新生代(ParNew是CMS默认的新生代垃圾回收器)和G1垃圾回收器中。标记复制算法可以分为三个阶段:标记阶段,即从GC Roots集合开始,标记活跃对象; 转移阶段,即把活跃对象复制到新的内存…

【unity】学习制作2D横板冒险游戏-4-

敌人的基本逻辑和动画 创建文件如图所示c#文件继承父类Enemy给boar挂载代码在敌人脚本中定义基本的变量并实例化面朝方向 在游戏中我们可以看到野猪的默认方向为左边 此时的transform.localscale的值为1我们希望当野猪面向右边时facedir的值为1,以此来判断敌人的面朝方向野猪的…

判断垃圾的方法

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔在Java中,判断对象是否为垃圾(即不再被使用,可以被垃圾回收器回收)主要依据两种主流的垃圾回收算法来实现:引用计数法和可达性分析算法。 引用计数法(Reference Counting)原理:为每个对象分配一个引用计数…

mRNA,IncRNA,miRNA

mRNA、lncRNA 和 miRNA 的核心区别 三者均为 RNA 分子,但在结构、功能和生物学作用上有显著差异: 1. mRNA(信使RNA)功能 :将 DNA 的遗传信息转录后传递至核糖体,指导蛋白质合成(基因表达的核心步骤)。结构 :单链线性结构,长度通常为数百至数千个核苷酸(nt)。 包含编码…

Training-WWW-Robots 攻防世界

进入网站看到根据提示可知:robots.txt 是关键点 进去看到:看到关键路径:进入看到flag

python第三章课后练习题

3.19 import time date_str = time.strftime("%Y年%m月%d日",time.localtime()) print("当前日期:",date_str)3.20 import time current_time = time.localtime() format1 = time.strftime("%Y年%m月%d日",current_time) print("格式1:&q…

[DevOps] 使用 Windows Sysprep(系统准备)重置计算机 SID

关于 Sysprep(系统准备) https://learn.microsoft.com/zh-cn/windows-hardware/manufacture/desktop/sysprep--system-preparation--overview?view=windows-11 Sysprep 是 Windows 映像的一部分,在审核模式下运行。Sysprep(系统准备)可以准备 Windows 客户端或 Windows S…

堆区的介绍

悲观者从机会中看到困难。乐观者从困难中看到机会。 ——温斯顿丘吉尔我们先来说堆。堆是 OOM 故障最主要的发生区域。它是内存区域中最大的一块区域,被所有线程共享,存储着几乎所有的实例对象、数组。所有的对象实例以及数组都要在堆上分配,但是随着 JIT 编译器的发展与逃逸…