本文,講解 Spring Boot 如何整合 RabbitMQ,實現訊息佇列。
部落格地址:blog.720ui.com/
什麼是 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
(完)
更多精彩文章,盡在「服務端鋪子」微信公眾號!