1. 程式人生 > >Spring Boot 揭秘與實戰(六) 消息隊列篇 - RabbitMQ

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

-i XML @service 我的文章 tro [] 創意 org ota

文章目錄

  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 實戰教程。

  • 【譯】RabbitMQ 實戰教程(一) Hello World!
  • 【譯】RabbitMQ 實戰教程(二) 工作隊列
  • 【譯】RabbitMQ 實戰教程(三) 發布/訂閱
  • 【譯】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. public static final String QUEUE_NAME = "spring-boot";
  4. public static final String QUEUE_EXCHANGE_NAME = "spring-boot-exchange";
  5. @Bean
  6. public Queue queue() {
  7. // 是否持久化
  8. boolean durable = true;
  9. // 僅創建者可以使用的私有隊列,斷開後自動刪除
  10. boolean exclusive = false;
  11. // 當所有消費客戶端連接斷開後,是否自動刪除隊列
  12. boolean autoDelete = false;
  13. return new Queue(QUEUE_NAME, durable, exclusive, autoDelete);
  14. }
  15. @Bean
  16. public TopicExchange exchange() {
  17. // 是否持久化
  18. boolean durable = true;
  19. // 當所有消費客戶端連接斷開後,是否自動刪除隊列
  20. boolean autoDelete = false;
  21. return new TopicExchange(QUEUE_EXCHANGE_NAME, durable, autoDelete);
  22. }
  23. @Bean
  24. public Binding binding(Queue queue, TopicExchange exchange) {
  25. return BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME);
  26. }
  27. @Bean
  28. SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
  29. MessageListenerAdapter listenerAdapter) {
  30. SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
  31. container.setConnectionFactory(connectionFactory);
  32. container.setQueueNames(QUEUE_NAME);
  33. container.setMessageListener(listenerAdapter);
  34. return container;
  35. }
  36. @Bean
  37. MessageListenerAdapter listenerAdapter(Receiver receiver) {
  38. return new MessageListenerAdapter(receiver, "receiveMessage");
  39. }
  40. }

消息生產者

創建消息生產者 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(RabbitMQConfig2.QUEUE_NAME, "你好, 梁桂釗!");
  8. }
  9. }

消息消費者

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

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

運行

  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

(完)



技術分享
  • 版權聲明:本文由 梁桂釗 發表於 梁桂釗的博客
  • 轉載聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證),非商業轉載請註明作者及出處,商業轉載請聯系作者本人。
  • 文章標題:Spring Boot 揭秘與實戰(六) 消息隊列篇 - RabbitMQ
  • 文章鏈接:http://blog.720ui.com/2017/springboot_06_mq_rabbitmq/

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