Springboot?整合?RabbitMQ?消息隊(duì)列?詳情
生產(chǎn)者工程
POM依賴
可以在創(chuàng)建工程時(shí)直接選擇添加依賴。


application文件
因?yàn)閞abbitmq具有默認(rèn)地址及用戶信息,所以如果是本地rabbitmq可以不需要進(jìn)行配置。


RabbitMQ配置文件:
在使用相關(guān)交換機(jī)及隊(duì)列時(shí),我們需要實(shí)現(xiàn)聲明交換機(jī)及隊(duì)列,如果沒(méi)有對(duì)應(yīng)信息,則啟動(dòng)項(xiàng)目會(huì)失敗。所以在使用springboot整合rabbitmq時(shí),我們可以通過(guò)配置文件來(lái)進(jìn)行交換機(jī)、隊(duì)列的聲明及二者之間的關(guān)系綁定。 由于目前在演示Fanout模式,所以使用FanoutExchange來(lái)聲明交換機(jī),其他模式則使用相對(duì)應(yīng)的TopicExchange,DirectExchange來(lái)聲明。
@Configuration
public class RabbitMQConfiguration {
//聲明fanout模式的交換機(jī)
@Bean
public FanoutExchange fanoutExchange() {
? ? return new FanoutExchange("fanout_order_exchange", true, false);
}
//聲明隊(duì)列
@Bean
public Queue smsQueue() {
? ? return new Queue("sms.fanout.queue", true);
}
@Bean
public Queue emailQueue() {
? ? return new Queue("email.fanout.queue", true);
}
@Bean
public Queue duanxinQueue() {
? ? return new Queue("duanxin.fanout.queue", true);
}
//綁定
@Bean
public Binding smsBinding() {
? ? return BindingBuilder.bind(smsQueue()).to(fanoutExchange());
}
@Bean
public Binding emailBinding() {
? ? return BindingBuilder.bind(emailQueue()).to(fanoutExchange());
}
@Bean
public Binding duanxinBinding() {
? ? return BindingBuilder.bind(duanxinQueue()).to(fanoutExchange());
}
}生產(chǎn)者業(yè)務(wù)代碼
這部分代碼就簡(jiǎn)單的通過(guò)調(diào)用rabbitTemplate來(lái)進(jìn)行消息的分發(fā)。@Service public class OrderService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void makeOrder() {
? ? // 保存訂單
? ? String orderId = UUID.randomUUID().toString();
? ? System.out.println("下單成功:" + orderId);
? ? // 通過(guò)MQ完成消息的分發(fā)
? ? // 參數(shù)1:交換機(jī) ;參數(shù)2:路由key/隊(duì)列名;參數(shù)3:消息內(nèi)容
? ? String exchangeName = "fanout_order_exchange";
? ? rabbitTemplate.convertAndSend(exchangeName, "", orderId);
}
}消費(fèi)者:
消費(fèi)者工程和生產(chǎn)者工程類(lèi)似,我們首先需要引入依賴,然后在application文件中進(jìn)行相關(guān)的配置即可開(kāi)始編寫(xiě)代碼。 在消費(fèi)者工程中我們也可以編寫(xiě)rabbitmq的配置文件來(lái)進(jìn)行交換機(jī)及隊(duì)列的聲明。建議在消費(fèi)端編寫(xiě)配置文件,因?yàn)橄M(fèi)端是先啟動(dòng)的工程,如果交換機(jī)和隊(duì)列未創(chuàng)建會(huì)導(dǎo)致工程啟動(dòng)失敗。 消息監(jiān)聽(tīng)
我們通過(guò)RabbitListener注解來(lái)監(jiān)聽(tīng)消息隊(duì)列。需要注意的是我們需要通過(guò)Component注解將該監(jiān)聽(tīng)交給spring管理,否則不能正常接收服務(wù)端的消息。 這邊只給出一個(gè)email的消息監(jiān)聽(tīng),上文生產(chǎn)者聲明的duanxin,sms隊(duì)列可以自行創(chuàng)建,只需要修改隊(duì)列名即可。@Service public class OrderService {
@RabbitListener(queues = {"email.fanout.queue"})
@Component
public class FanoutEmailService {
? ? @RabbitHandler
? ? public void receive(String message) {
? ? ? ? System.out.println("email fanout -----》接收到" + message);
? ? }
}測(cè)試
首先啟動(dòng)消費(fèi)者工程,然后在生產(chǎn)者工程中創(chuàng)建測(cè)試類(lèi)發(fā)送消息即可。
@SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests {
@Autowired
private OrderService orderService;
@Test
void contextLoads() {
? ? orderService.makeOrder();
}
}當(dāng)發(fā)送消息后,我們可以在控制臺(tái)中發(fā)現(xiàn)消費(fèi)者成功接受消息。

Direct 模式
生產(chǎn)者
建立工程的步驟和上文相同。
配置文件
配置和上文基本相同,由于該部分測(cè)試direct模式,所以需要使用DirectExchange創(chuàng)建交換機(jī)。需要注意的是該類(lèi)中的方法名不能和上文rabbitmq的配置文件中的方法名相同,因?yàn)槲覀兪褂胋ean注解將其交給spring管理,如果名字相同,則會(huì)啟動(dòng)項(xiàng)目失敗。
@Configuration
public class DirectRabbitMQConfiguration {
//聲明direct模式的交換機(jī)
@Bean
public DirectExchange directExchange() {
? ? return new DirectExchange("direct_order_exchange", true, false);
}
//聲明隊(duì)列
@Bean
public Queue smsDirectQueue() {
? ? return new Queue("sms.direct.queue", true);
}
@Bean
public Queue emailDirectQueue() {
? ? return new Queue("email.direct.queue", true);
}
@Bean
public Queue duanxinDirectQueue() {
? ? return new Queue("duanxin.direct.queue", true);
}
//綁定
@Bean
public Binding smsDirectBinding() {
? ? return BindingBuilder.bind(smsDirectQueue()).to(directExchange()).with("sms");
}
@Bean
public Binding emailDirectBinding() {
? ? return BindingBuilder.bind(emailDirectQueue()).to(directExchange()).with("email");
}
@Bean
public Binding duanxinDirectBinding() {
? ? return BindingBuilder.bind(duanxinDirectQueue()).to(directExchange()).with("duanxin");
}
}業(yè)務(wù)代碼
@Service
public class OrderService {
? ? @Autowired
? ? private RabbitTemplate rabbitTemplate;
? ? public void makeOrderDirect() {
? ? ? ? // 保存訂單
? ? ? ? String orderId = UUID.randomUUID().toString();
? ? ? ? System.out.println("下單成功:" + orderId);
? ? ? ? String exchangeName = "direct_order_exchange";
? ? ? ? rabbitTemplate.convertAndSend(exchangeName, "sms", orderId);
? ? ? ? rabbitTemplate.convertAndSend(exchangeName, "email", orderId);
? ? }
}消費(fèi)者
消息監(jiān)聽(tīng)
和上文相同,只需注意隊(duì)列名即可。
@RabbitListener(queues = {"email.direct.queue"})
@Component
public class DirectEmailService {
? ? @RabbitHandler
? ? public void receive(String message) {
? ? ? ? System.out.println("email direct -----》接收到" + message);
? ? }
}Topic 模式
上文中個(gè)模式都是通過(guò)配置文件來(lái)聲明交換機(jī),隊(duì)列及綁定二者之間的關(guān)系;實(shí)際上我們還可以通過(guò)注解的方式來(lái)聲明交換機(jī)及注解。
生產(chǎn)者
由于使用注解方式聲明,所以我們不需要?jiǎng)?chuàng)建配置文件,直接編寫(xiě)業(yè)務(wù)代碼即可。測(cè)試的時(shí)候我們只需修改路由名即可,具體如何修改,請(qǐng)前往文章開(kāi)頭鏈接查看各模式是如何使用的。
@Service
public class OrderService {
@Autowired
private RabbitTemplate rabbitTemplate;
public void makeOrderTopic() {
? ? // 保存訂單
? ? String orderId = UUID.randomUUID().toString();
? ? System.out.println("下單成功:" + orderId);
? ? String exchangeName = "topic_order_exchange";
? ? String routingKey = "com.email";
? ? rabbitTemplate.convertAndSend(exchangeName, routingKey, orderId);
}
}消費(fèi)者
代碼和上文基本相同,區(qū)別在于我們直接在RabbitListener注解中將隊(duì)列和交換機(jī)進(jìn)行綁定。需要注意的是各參數(shù)中都是使用字符串。 value對(duì)應(yīng)的是隊(duì)列,相應(yīng)的參數(shù)分別是隊(duì)列名、持久化、自動(dòng)刪除。 exchange對(duì)應(yīng)的交換機(jī),相應(yīng)的參數(shù)分別是交換機(jī)名以及交換機(jī)類(lèi)型。 key對(duì)應(yīng)的是路由名。
@RabbitListener(bindings = @QueueBinding(
? ? ? ? value = @Queue(value = "email.topic.queue",durable = "true",autoDelete = "false"),
? ? ? ? exchange = @Exchange(value = "topic_order_exchange",type = ExchangeTypes.TOPIC),
? ? ? ? key = "*.email.#"
))
@Component
public class TopicEmailService {
? ? @RabbitHandler
? ? public void receive(String message) {
? ? ? ? System.out.println("email topic -----》接收到" + message);
? ? }
}以上便是springboot 整合 rabbitmq的兩種方式。但是在日常開(kāi)發(fā)中更推薦使用配置文件的形式來(lái)實(shí)現(xiàn),因?yàn)樵谂渲梦募锌梢愿玫奶幚磉^(guò)期時(shí)間、死信隊(duì)列等消息隊(duì)列中的高級(jí)特性。
到此這篇關(guān)于Springboot 整合 RabbitMQ 消息隊(duì)列 詳情的文章就介紹到這了,更多相關(guān)Springboot 整合 RabbitMQ 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring?Data?Exists查詢最佳方法編寫(xiě)示例
這篇文章主要為大家介紹了Spring?Data?Exists查詢最佳方法編寫(xiě)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Java面試Logback打印日志如何獲取當(dāng)前方法名稱(chēng)題解
這篇文章主要為大家介紹了Java面試Logback打印日志如何獲取當(dāng)前方法名稱(chēng)題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Java的Hibernate框架中Criteria查詢使用的實(shí)例講解
這篇文章主要介紹了Java的Hibernate框架中Criteria查詢使用的實(shí)例講解,Hibernate是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下2016-01-01
java面試突擊之sleep和wait有什么區(qū)別詳析
按理來(lái)說(shuō)sleep和wait本身就是八竿子打不著的兩個(gè)東西,但是在實(shí)際使用中大家都喜歡拿他們來(lái)做比較,或許是因?yàn)樗鼈兌伎梢宰尵€程處于阻塞狀態(tài),這篇文章主要給大家介紹了關(guān)于java面試突擊之sleep和wait有什么區(qū)別的相關(guān)資料,需要的朋友可以參考下2022-02-02
Java中使用instanceof判斷對(duì)象類(lèi)型的示例
在List<Object>中遍歷Object時(shí),先判斷類(lèi)型,再定向轉(zhuǎn)換,本文給大家介紹Java中使用instanceof判斷對(duì)象類(lèi)型,感興趣的朋友跟隨小編一起看看吧2023-08-08
解決IDEA創(chuàng)建maven項(xiàng)目時(shí)pom.xml沒(méi)有變藍(lán)的問(wèn)題
這篇文章主要介紹了解決IDEA創(chuàng)建maven項(xiàng)目時(shí)pom.xml沒(méi)有變藍(lán)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08

