1. 程式人生 > >spring boot 整合 RabbitMQ

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!