Spring?Boot+RabbitMQ?通過(guò)fanout模式實(shí)現(xiàn)消息接收功能(支持消費(fèi)者多實(shí)例部署)
本文章適用的場(chǎng)景:同一條消息可以被多個(gè)消費(fèi)者同時(shí)消費(fèi)。注意:當(dāng)消費(fèi)者多實(shí)例部署時(shí),會(huì)輪詢消費(fèi)消息。網(wǎng)上有大量的的案例展示:P生產(chǎn)一條消息,消費(fèi)者服務(wù)C中建立Q1和Q2兩個(gè)隊(duì)列共同消費(fèi)。但極少的材料展示:P生產(chǎn)一條消息后M1,消費(fèi)者C1和C2可以同時(shí)消費(fèi)M1,如下圖所示。案例基于Spring Boot以及RabbitMQ的“fanout”類型exchange。已經(jīng)實(shí)測(cè)可放心使用。

1、引入基本依賴,項(xiàng)目不同請(qǐng)您按自己的情況引入合適的依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>2、rabbitmq密碼、用戶名等配置
內(nèi)容過(guò)于基礎(chǔ),請(qǐng)網(wǎng)絡(luò)上自行搜索相關(guān)內(nèi)容。
3、Exchange配置
@Bean
public FanoutExchange myFanoutExchange() {
//“my.fanout”僅用于演示,請(qǐng)按自己的項(xiàng)目情況選擇合適的、有意義的命名
return new FanoutExchange("my.fanout", true, false);
}
@Bean
public Queue anonymousQueue() {
//注意:必須使用匿名隊(duì)列才能達(dá)到本文目標(biāo),此匿名隊(duì)列實(shí)例的名稱在消費(fèi)端會(huì)被使用
return new AnonymousQueue();
public Binding bindAnonymousQueue() {
return BindingBuilder.bind(anonymousQueue()).to(myFanoutExchange());4、發(fā)送端代碼
//構(gòu)建回調(diào)返回的數(shù)據(jù)
CorrelationData correlationData = new CorrelationData(UUIDUtils.getUUID());
Message msg = MessageBuilder.withBody(message.getBytes())
.setContentType(MessageProperties.CONTENT_TYPE_TEXT_PLAIN)
.setCorrelationId(correlationData.getId())
.build();
try {
rabbitTemplate.convertAndSend(exchangeName, null, msg, correlationData);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}注意:“fanout"模式直接將消息發(fā)送到“exchange”,routing key應(yīng)為null或“”,如果您的代碼只需要發(fā)送消息而無(wú)接收,請(qǐng)忽略第3小節(jié)“Exchange配置”中所示代碼
5、消費(fèi)者代碼
@Service
public class MyListener {
@RabbitListener(queues = "#{anonymousQueue.name}")
public void receive(String message, Message message1, Channel channel) {
try {
//your code
} catch (Exception e) {
logger.error(e.getMessage(), e);
} finally {
long deliverTag = message1.getMessageProperties().getDeliveryTag();
channel.basicAck(deliverTag, false);
}
}
}代碼“@RabbitListener…”中的“#{anonymousQueue.name}”中的“anonymousQueue”對(duì)應(yīng)第3小節(jié)“Exchange配置”中所聲明的匿名隊(duì)列實(shí)例。
到此這篇關(guān)于Spring Boot+RabbitMQ 通過(guò)fanout模式實(shí)現(xiàn)消息接收(支持消費(fèi)者多實(shí)例部署)的文章就介紹到這了,更多相關(guān)Spring Boot RabbitMQ實(shí)現(xiàn)消息接收內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警
EMQX?的上下線系統(tǒng)消息通知功能在客戶端連接成功或者客戶端斷開連接,需要實(shí)現(xiàn)設(shè)備的上下線狀態(tài)監(jiān)控,所以本文給大家介紹了如何通過(guò)SpringBoot實(shí)現(xiàn)EMQ設(shè)備的上下線告警,文中有詳細(xì)的代碼示例,需要的朋友可以參考下2023-10-10
淺談@Aspect@Order各個(gè)通知的執(zhí)行順序
這篇文章主要介紹了@Aspect@Order各個(gè)通知的執(zhí)行順序,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
解決redisTemplate向redis中插入String類型數(shù)據(jù)時(shí)出現(xiàn)亂碼問(wèn)題
這篇文章主要介紹了解決redisTemplate向redis中插入String類型數(shù)據(jù)時(shí)出現(xiàn)亂碼問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
SpringBoot+Redission實(shí)現(xiàn)排行榜功能的示例代碼
這篇文章主要介紹了基于SpringBoot+Redission實(shí)現(xiàn)排行榜功能,實(shí)現(xiàn)一個(gè)排行榜,要求按照分?jǐn)?shù)和達(dá)成這個(gè)分?jǐn)?shù)的時(shí)間排序,即相同分?jǐn)?shù)下,時(shí)間早的在上面,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
一文搞懂Spring中@Autowired和@Resource的區(qū)別
@Autowired?和?@Resource?都是?Spring/Spring?Boot?項(xiàng)目中,用來(lái)進(jìn)行依賴注入的注解。它們都提供了將依賴對(duì)象注入到當(dāng)前對(duì)象的功能,但二者卻有眾多不同,并且這也是常見的面試題之一,所以我們今天就來(lái)盤它2022-08-08
SpringSecurity框架下實(shí)現(xiàn)CSRF跨站攻擊防御的方法
CSRF是一種網(wǎng)絡(luò)攻擊方式,也可以說(shuō)是一種安全漏洞,這種安全漏洞在web開發(fā)中廣泛存在。這篇文章主要介紹了SpringSecurity框架下實(shí)現(xiàn)CSRF跨站攻擊防御,需要的朋友可以參考下2019-12-12
SpringBoot集成Graphql Query實(shí)戰(zhàn)示例
這篇文章主要為大家介紹了SpringBoot集成Graphql Query實(shí)戰(zhàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09
Mybatis-Plus或PageHelper多表分頁(yè)查詢總條數(shù)不對(duì)問(wèn)題的解決方法
PageHelper 這個(gè)插件用了很多次了,今天使用的時(shí)候才遇到一個(gè)問(wèn)題,這篇文章主要給大家介紹了關(guān)于Mybatis-Plus或PageHelper多表分頁(yè)查詢總條數(shù)不對(duì)問(wèn)題的解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08

