您好,登錄后才能下訂單哦!
這篇文章主要介紹“Springboot怎么整合RabbitMQ消息隊列”,在日常操作中,相信很多人在Springboot怎么整合RabbitMQ消息隊列問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Springboot怎么整合RabbitMQ消息隊列”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
可以在創建工程時直接選擇添加依賴。
因為rabbitmq具有默認地址及用戶信息,所以如果是本地rabbitmq可以不需要進行配置。
RabbitMQ配置文件:
在使用相關交換機及隊列時,我們需要實現聲明交換機及隊列,如果沒有對應信息,則啟動項目會失敗。所以在使用springboot整合rabbitmq時,我們可以通過配置文件來進行交換機、隊列的聲明及二者之間的關系綁定。 由于目前在演示Fanout模式,所以使用FanoutExchange來聲明交換機,其他模式則使用相對應的TopicExchange,DirectExchange來聲明。
@Configuration public class RabbitMQConfiguration { //聲明fanout模式的交換機 @Bean public FanoutExchange fanoutExchange() { return new FanoutExchange("fanout_order_exchange", true, false); } //聲明隊列 @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()); } }
這部分代碼就簡單的通過調用rabbitTemplate來進行消息的分發。@Service public class OrderService {
@Autowired private RabbitTemplate rabbitTemplate; public void makeOrder() { // 保存訂單 String orderId = UUID.randomUUID().toString(); System.out.println("下單成功:" + orderId); // 通過MQ完成消息的分發 // 參數1:交換機 ;參數2:路由key/隊列名;參數3:消息內容 String exchangeName = "fanout_order_exchange"; rabbitTemplate.convertAndSend(exchangeName, "", orderId); } }
消費者:
消費者工程和生產者工程類似,我們首先需要引入依賴,然后在application文件中進行相關的配置即可開始編寫代碼。 在消費者工程中我們也可以編寫rabbitmq的配置文件來進行交換機及隊列的聲明。建議在消費端編寫配置文件,因為消費端是先啟動的工程,如果交換機和隊列未創建會導致工程啟動失敗。 消息監聽
我們通過RabbitListener注解來監聽消息隊列。需要注意的是我們需要通過Component注解將該監聽交給spring管理,否則不能正常接收服務端的消息。 這邊只給出一個email的消息監聽,上文生產者聲明的duanxin,sms隊列可以自行創建,只需要修改隊列名即可。@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); } }
首先啟動消費者工程,然后在生產者工程中創建測試類發送消息即可。
@SpringBootTest class SpringbootOrderRabbitmqProducerApplicationTests { @Autowired private OrderService orderService; @Test void contextLoads() { orderService.makeOrder(); } }
當發送消息后,我們可以在控制臺中發現消費者成功接受消息。
生產者
建立工程的步驟和上文相同。
配置文件
配置和上文基本相同,由于該部分測試direct模式,所以需要使用DirectExchange創建交換機。需要注意的是該類中的方法名不能和上文rabbitmq的配置文件中的方法名相同,因為我們使用bean注解將其交給spring管理,如果名字相同,則會啟動項目失敗。
@Configuration public class DirectRabbitMQConfiguration { //聲明direct模式的交換機 @Bean public DirectExchange directExchange() { return new DirectExchange("direct_order_exchange", true, false); } //聲明隊列 @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"); } }
@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); } }
和上文相同,只需注意隊列名即可。
@RabbitListener(queues = {"email.direct.queue"}) @Component public class DirectEmailService { @RabbitHandler public void receive(String message) { System.out.println("email direct -----》接收到" + message); } }
上文中個模式都是通過配置文件來聲明交換機,隊列及綁定二者之間的關系;實際上我們還可以通過注解的方式來聲明交換機及注解。
由于使用注解方式聲明,所以我們不需要創建配置文件,直接編寫業務代碼即可。測試的時候我們只需修改路由名即可,具體如何修改,請前往文章開頭鏈接查看各模式是如何使用的。
@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); } }
代碼和上文基本相同,區別在于我們直接在RabbitListener注解中將隊列和交換機進行綁定。需要注意的是各參數中都是使用字符串。 value對應的是隊列,相應的參數分別是隊列名、持久化、自動刪除。 exchange對應的交換機,相應的參數分別是交換機名以及交換機類型。 key對應的是路由名。
@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消息隊列”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。