Spring Boot 揭秘與實戰(六) 消息隊列篇 - RabbitMQ


文章目錄

  1. 1. 什么是 RabitMQ
  2. 2. Spring Boot 整合 RabbitMQ
  3. 3. 實戰演練4. 源代碼
    1. 3.1. 一個簡單的實戰開始
      1. 3.1.1. Configuration
      2. 3.1.2. 消息生產者
      3. 3.1.3. 消息消費者
      4. 3.1.4. 運行
      5. 3.1.5. 單元測試
    2. 3.2. 路由的實戰演練
      1. 3.2.1. Configuration
      2. 3.2.2. 消息生產者
      3. 3.2.3. 消息消費者
      4. 3.2.4. 運行
      5. 3.2.5. 單元測試

本文,講解 Spring Boot 如何集成 RabbitMQ,實現消息隊列。

什么是 RabitMQ

RabbitMQ 是一個在 AMQP 基礎上完整的,可復用的企業消息系統。

關於 RabbitMQ 的使用,可以閱讀之前的 RabbitMQ 實戰教程。

Spring Boot 整合 RabbitMQ

Spring Boot 整合 RabbitMQ 是非常容易,只需要兩個步驟。

首先,在 pom.xml 中增加 RabbitMQ 依賴。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-amqp</artifactId>
  4. </dependency>

第二步,在 src/main/resources/application.properties 中配置信息。

  1. #rabbitmq
  2. spring.rabbitmq.host=localhost
  3. spring.rabbitmq.port=5672
  4. spring.rabbitmq.username=guest
  5. spring.rabbitmq.password=guest

實戰演練

一個簡單的實戰開始

我們來實現一個簡單的發送、接收消息。

Configuration

在 Spring Boot 中使用 @Bean 注冊一個隊列。

  1. @Configuration
  2. public class RabbitMQConfig {
  3. public static final String QUEUE_NAME = "spring-boot-simple";
  4. @Bean
  5. public Queue queue() {
  6. return new Queue(QUEUE_NAME);
  7. }
  8. }

消息生產者

創建消息生產者 Sender。通過注入 AmqpTemplate 接口的實例來實現消息的發送。

  1. @Service
  2. public class Sender {
  3. @Autowired
  4. private AmqpTemplate rabbitTemplate;
  5. public void send() {
  6. System.out.println("梁桂釗 發送消息...");
  7. rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME, "你好, 梁桂釗!");
  8. }
  9. }

消息消費者

創建消息消費者 Receiver。通過 @RabbitListener 注解定義對隊列的監聽。

  1. @Service
  2. public class Receiver {
  3. @Autowired
  4. private AmqpTemplate rabbitTemplate;
  5. @RabbitListener(queues = "spring-boot-simple")
  6. public void receiveMessage(String message) {
  7. System.out.println("Received <" + message + ">");
  8. }
  9. }

運行

  1. @SpringBootApplication
  2. @EnableAutoConfiguration
  3. @ComponentScan(basePackages = { "com.lianggzone.springboot" })
  4. public class RunMain {
  5. public static void main(String[] args) {
  6. SpringApplication.run(RunMain.class, args);
  7. }
  8. }

單元測試

創建單元測試用例

  1. public class RabbitMQTest {
  2. @Autowired
  3. private Sender sender;
  4. @Test
  5. public void send() throws Exception {
  6. sender.send();
  7. }
  8. }

路由的實戰演練

經過上面的實戰案例,我們對 Spring Boot 整合 RabbitMQ 有了一定的了解。現在,我們再來看下 RabbitMQ 路由場景。

Configuration

在 RabbitMQConfig 中,我們注冊 隊列,轉發器,監聽等。

  1. @Configuration
  2. public class RabbitMQConfig2 {
  3.  
  4. public static final String QUEUE_NAME = "spring-boot";
  5. public static final String QUEUE_EXCHANGE_NAME = "spring-boot-exchange";
  6.  
  7. @Bean
  8. public Queue queue() {
  9. // 是否持久化
  10. boolean durable = true;
  11. // 僅創建者可以使用的私有隊列,斷開后自動刪除
  12. boolean exclusive = false;
  13. // 當所有消費客戶端連接斷開后,是否自動刪除隊列
  14. boolean autoDelete = false;
  15. return new Queue(QUEUE_NAME, durable, exclusive, autoDelete);
  16. }
  17.  
  18. @Bean
  19. public TopicExchange exchange() {
  20. // 是否持久化
  21. boolean durable = true;
  22. // 當所有消費客戶端連接斷開后,是否自動刪除隊列
  23. boolean autoDelete = false;
  24. return new TopicExchange(QUEUE_EXCHANGE_NAME, durable, autoDelete);
  25. }
  26.  
  27. @Bean
  28. public Binding binding(Queue queue, TopicExchange exchange) {
  29. return BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME);
  30. }
  31.  
  32. @Bean
  33. SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
  34. MessageListenerAdapter listenerAdapter) {
  35. SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
  36. container.setConnectionFactory(connectionFactory);
  37. container.setQueueNames(QUEUE_NAME);
  38. container.setMessageListener(listenerAdapter);
  39. return container;
  40. }
  41.  
  42. @Bean
  43. MessageListenerAdapter listenerAdapter(Receiver receiver) {
  44. return new MessageListenerAdapter(receiver, "receiveMessage");
  45. }
  46. }

消息生產者

創建消息生產者 Sender。通過注入 AmqpTemplate 接口的實例來實現消息的發送。

  1. @Service
  2. public class Sender {
  3.  
  4. @Autowired
  5. private AmqpTemplate rabbitTemplate;
  6.  
  7. public void send() {
  8. System.out.println("梁桂釗 發送消息...");
  9. rabbitTemplate.convertAndSend(RabbitMQConfig2.QUEUE_NAME, "你好, 梁桂釗!");
  10. }
  11. }

消息消費者

創建消息消費者 Receiver。通過 @RabbitListener 注解定義對隊列的監聽。

  1. @Service
  2. public class Receiver {
  3.  
  4. public void receiveMessage(String message) {
  5. System.out.println("Received <" + message + ">");
  6. }
  7. }

運行

  1. @SpringBootApplication
  2. @EnableAutoConfiguration
  3. @ComponentScan(basePackages = { "com.lianggzone.springboot" })
  4. public class RunMain {
  5. public static void main(String[] args) {
  6. SpringApplication.run(RunMain.class, args);
  7. }
  8. }

單元測試

創建單元測試用例

  1. public class RabbitMQTest {
  2. @Autowired
  3. private Sender sender;
  4. @Test
  5. public void send() throws Exception {
  6. sender.send();
  7. }
  8. }

源代碼

相關示例完整代碼: springboot-action

(完)

 

微信公眾號


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM