spring boot 整合 RabbitMQ
RabbitMQ是一個訊息中介軟體,負責專案間訊息的傳遞。使用訊息中介軟體可以做到專案間解耦和訊息的非同步處理。支援多語言開發。
RabbitMQ原理:
首先是在RabbitMQ建立所需的exchange中轉站和queue佇列。建立exchange和queue可以通過伺服器程式碼實現,也可以通過RabbitMQ提供的web管理介面或者http api來操作。
訊息生產者伺服器將訊息傳送到指定的exchange中轉站,中轉站接收到路由指定,將訊息放入exchange通過routekey繫結的queue佇列,等待訊息被消費。
訊息消費者伺服器連線到RabbitMQ,通過對指定queue佇列的監聽來獲取訊息。
同時RabbitMQ做了訊息確認和訊息持久化的方案來確保訊息是否被消費和crash之後的訊息的恢復。
RabbitMQ提供了豐富的http api介面供呼叫來監控RabbitMQ的執行情況。
spring boot整合RabbitMQ使用:
引入jar包
pom.xml中增加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency >
配置
在啟動類中增加:
@Bean(name = "demoQueue")
public Queue getQueue(){
return new Queue("queueName");
}
@Bean(name = "demoExchange")
TopicExchange exchange() {
return new TopicExchange("exchangeName");
}
@Bean
Binding binding(Queue demoQueue, TopicExchange demoExchange) {
return BindingBuilder.bind(demoQueue).to(demoExchange).with("routingKey");
}
上面這段程式碼的意思是:建立一個名為queueName的queue和名為exchangeName的exchange,然後通過名為routingKey的路由鍵將該queue繫結到exchange上。
這一步建立exchange和queue及繫結應該是在訊息生成者中。之後才是傳送訊息。
訊息是不會發送到一個不存在的queue上的。
簡單的訊息傳送
@Component
public class MessageSender{
@Autowired
private RabbitTemplate rabbitTemplate;
//傳送一個字串
public void send(String msg) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", msg);
}
//傳送一個可序列化物件
public void send(Job job) {
this.rabbitTemplate.convertAndSend("exchangeName","routingKey", job);
}
}
convertAndSend()方法提供了很多過載實現。傳遞的訊息型別是object。
另外如果傳遞物件的話,該物件必須繼承了Serializable介面。同時,訊息接收者必須有同樣的物件類來接收該訊息,而且該物件類所處的包路徑必須一致才行。
訊息傳送可以繼承RabbitTemplate.ConfirmCallback介面來實現訊息傳送確認機制。
接收訊息
@Component
@RabbitListener(queues = "queueName")
public class RabbitMqReciever {
@RabbitHandler
public void process(String hello) {
System.out.println("Receiver : " + hello);
}
@RabbitHandler
public void process(Job job) {
System.out.println("Receiver : " + job);
}
}
註解@RabbitListener()是指定接收訊息的名為queueName的queue
如果有訊息就根據訊息型別的不同來呼叫不同的方法。
OVER!