文章目錄
本文,講解 Spring Boot 如何集成 RabbitMQ,實現消息隊列。
什么是 RabitMQ
RabbitMQ 是一個在 AMQP 基礎上完整的,可復用的企業消息系統。
關於 RabbitMQ 的使用,可以閱讀之前的 RabbitMQ 實戰教程。
- 【譯】RabbitMQ 實戰教程(一) Hello World!
- 【譯】RabbitMQ 實戰教程(二) 工作隊列
- 【譯】RabbitMQ 實戰教程(三) 發布/訂閱
- 【譯】RabbitMQ 實戰教程(四) 路由
- 【譯】RabbitMQ 實戰教程(五) 主題
Spring Boot 整合 RabbitMQ
Spring Boot 整合 RabbitMQ 是非常容易,只需要兩個步驟。
首先,在 pom.xml 中增加 RabbitMQ 依賴。
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-amqp</artifactId>
- </dependency>
第二步,在 src/main/resources/application.properties 中配置信息。
- #rabbitmq
- spring.rabbitmq.host=localhost
- spring.rabbitmq.port=5672
- spring.rabbitmq.username=guest
- spring.rabbitmq.password=guest
實戰演練
一個簡單的實戰開始
我們來實現一個簡單的發送、接收消息。
Configuration
在 Spring Boot 中使用 @Bean 注冊一個隊列。
- @Configuration
- public class RabbitMQConfig {
- public static final String QUEUE_NAME = "spring-boot-simple";
- @Bean
- public Queue queue() {
- return new Queue(QUEUE_NAME);
- }
- }
消息生產者
創建消息生產者 Sender。通過注入 AmqpTemplate 接口的實例來實現消息的發送。
- @Service
- public class Sender {
- @Autowired
- private AmqpTemplate rabbitTemplate;
- public void send() {
- System.out.println("梁桂釗 發送消息...");
- rabbitTemplate.convertAndSend(RabbitMQConfig.QUEUE_NAME, "你好, 梁桂釗!");
- }
- }
消息消費者
創建消息消費者 Receiver。通過 @RabbitListener 注解定義對隊列的監聽。
- @Service
- public class Receiver {
- @Autowired
- private AmqpTemplate rabbitTemplate;
- @RabbitListener(queues = "spring-boot-simple")
- public void receiveMessage(String message) {
- System.out.println("Received <" + message + ">");
- }
- }
運行
- @SpringBootApplication
- @EnableAutoConfiguration
- @ComponentScan(basePackages = { "com.lianggzone.springboot" })
- public class RunMain {
- public static void main(String[] args) {
- SpringApplication.run(RunMain.class, args);
- }
- }
單元測試
創建單元測試用例
- public class RabbitMQTest {
- @Autowired
- private Sender sender;
- @Test
- public void send() throws Exception {
- sender.send();
- }
- }
路由的實戰演練
經過上面的實戰案例,我們對 Spring Boot 整合 RabbitMQ 有了一定的了解。現在,我們再來看下 RabbitMQ 路由場景。
Configuration
在 RabbitMQConfig 中,我們注冊 隊列,轉發器,監聽等。
- @Configuration
- public class RabbitMQConfig2 {
- public static final String QUEUE_NAME = "spring-boot";
- public static final String QUEUE_EXCHANGE_NAME = "spring-boot-exchange";
- @Bean
- public Queue queue() {
- // 是否持久化
- boolean durable = true;
- // 僅創建者可以使用的私有隊列,斷開后自動刪除
- boolean exclusive = false;
- // 當所有消費客戶端連接斷開后,是否自動刪除隊列
- boolean autoDelete = false;
- return new Queue(QUEUE_NAME, durable, exclusive, autoDelete);
- }
- @Bean
- public TopicExchange exchange() {
- // 是否持久化
- boolean durable = true;
- // 當所有消費客戶端連接斷開后,是否自動刪除隊列
- boolean autoDelete = false;
- return new TopicExchange(QUEUE_EXCHANGE_NAME, durable, autoDelete);
- }
- @Bean
- public Binding binding(Queue queue, TopicExchange exchange) {
- return BindingBuilder.bind(queue).to(exchange).with(QUEUE_NAME);
- }
- @Bean
- SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
- MessageListenerAdapter listenerAdapter) {
- SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
- container.setConnectionFactory(connectionFactory);
- container.setQueueNames(QUEUE_NAME);
- container.setMessageListener(listenerAdapter);
- return container;
- }
- @Bean
- MessageListenerAdapter listenerAdapter(Receiver receiver) {
- return new MessageListenerAdapter(receiver, "receiveMessage");
- }
- }
消息生產者
創建消息生產者 Sender。通過注入 AmqpTemplate 接口的實例來實現消息的發送。
- @Service
- public class Sender {
- @Autowired
- private AmqpTemplate rabbitTemplate;
- public void send() {
- System.out.println("梁桂釗 發送消息...");
- rabbitTemplate.convertAndSend(RabbitMQConfig2.QUEUE_NAME, "你好, 梁桂釗!");
- }
- }
消息消費者
創建消息消費者 Receiver。通過 @RabbitListener 注解定義對隊列的監聽。
- @Service
- public class Receiver {
- public void receiveMessage(String message) {
- System.out.println("Received <" + message + ">");
- }
- }
運行
- @SpringBootApplication
- @EnableAutoConfiguration
- @ComponentScan(basePackages = { "com.lianggzone.springboot" })
- public class RunMain {
- public static void main(String[] args) {
- SpringApplication.run(RunMain.class, args);
- }
- }
單元測試
創建單元測試用例
- public class RabbitMQTest {
- @Autowired
- private Sender sender;
- @Test
- public void send() throws Exception {
- sender.send();
- }
- }
源代碼
相關示例完整代碼: springboot-action
(完)
