《RabbitMQ 消息中間件》SpringBoot整合RabbitMQ

前言

RabbitMQ單獨使用的場景現在非常少,基本都是整合在Spring中,接下來我們就針對SpringBoot如何整合RabbitMQ進行說明

整合

1. 導入依賴包(Gradle)

compile('org.springframework.boot:spring-boot-starter-amqp')

2. 配置文件設置(application.properties)

spring.rabbitmq.host=47.105.72.224
spring.rabbitmq.port=5672
spring.rabbitmq.username=rabbitmq
spring.rabbitmq.password=rabbitmq
spring.rabbitmq.virtual-host=/my

3. SpringBoot提供和模板對象(RabbitTemplate)。

4. 案例1: 直連。

生產者:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ProviderMQ {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendMessage(){
        rabbitTemplate.convertAndSend("hello","hello world!");
    }
}

消費者:SpringBoot啓動自動會創建線程監聽消息

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 使用註解設置隊列:@Queue
 * value 爲隊列名
 * durable 爲是否持久化 默認值是true
 * autoDelete 是否自動刪除隊列 默認值是false
 */
@Component
@RabbitListener(queuesToDeclare = @Queue(value = "hello",durable = "true",autoDelete = "true"))
public class CustomerMQ {

    @RabbitHandler
    public void receiveMessage(String message){
        System.out.println("接收到的消息:"+message);
    }
}

測試類:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

@RestController
public class Test {

    @Autowired
    ProviderMQ provider;

    @RequestMapping("/Send.do")
    public String workSend() throws IOException, TimeoutException {
        provider.sendMessage();
        return "success";
    }
}

運行結果:

案例2: work queue

生產者:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class WorkProviderMQ {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendMessage(){
        for (int i = 0; i < 10; i++) {
            rabbitTemplate.convertAndSend("work","第"+i+"個消息:hello work!");
        }
    }
}

消費者:

import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 使用註解設置隊列:@Queue
 * value 爲隊列名
 * durable 爲是否持久化 默認值是true
 * autoDelete 是否自動刪除隊列 默認值是false
 */
@Component

public class WorkCustomerMQ {

    @RabbitListener(queuesToDeclare = @Queue(value = "work"))
    public void receiveMessage1(String message){
        System.out.println("接收到的消息1:"+message);
    }

    @RabbitListener(queuesToDeclare = @Queue(value = "work"))
    public void receiveMessage2(String message){
        System.out.println("接收到的消息2:"+message);
    }
}

運行結果:

案例3: 廣播(fanout)

生產者:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class FanoutProviderMQ {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendMessage(){
        rabbitTemplate.convertAndSend("fanoutMessage","","fanout消息:hello fanout!");
    }
}

消費者:

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 使用註解設置隊列:@Queue
 * value 爲隊列名
 * durable 爲是否持久化 默認值是true
 * autoDelete 是否自動刪除隊列 默認值是false
 */
@Component

public class FanoutCustomerMQ {

    /**
     * @Queue 不加value 表示臨時隊列
     * @param message
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "fanoutMessage",type = "fanout"))})
    public void receiveMessage1(String message){
        System.out.println("接收到的消息1:"+message);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "fanoutMessage",type = "fanout"))})
    public void receiveMessage2(String message){
        System.out.println("接收到的消息2:"+message);
    }
}

運行結果:

案例4: 訂閱(Routing)

生產者:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class DirectProviderMQ {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendMessage(){
        rabbitTemplate.convertAndSend("directMessage","info","direct消息:hello info!");
        rabbitTemplate.convertAndSend("directMessage","error","direct消息:hello error!");
        rabbitTemplate.convertAndSend("directMessage","warn","direct消息:hello warn!");
    }
}

消費者:

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 使用註解設置隊列:@Queue
 * value 爲隊列名
 * durable 爲是否持久化 默認值是true
 * autoDelete 是否自動刪除隊列 默認值是false
 */
@Component

public class DirectCustomerMQ {

    /**
     * @Queue 不加value 表示臨時隊列
     * type = "direct" direct 是默認模式
     * @param message
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directMessage",type = "direct"),key = {"info","error"})})
    public void receiveMessage1(String message){
        System.out.println("接收到的消息1:"+message);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "directMessage",type = "direct"),key = {"warn"})})
    public void receiveMessage2(String message){
        System.out.println("接收到的消息2:"+message);
    }
}

運行結果:

案例5:動態訂閱(Topic)

生產者:

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class TopicProviderMQ {

    @Autowired
    RabbitTemplate rabbitTemplate;

    public void sendMessage(){
        rabbitTemplate.convertAndSend("topicMessage","user.info","direct消息:hello user.info!");
        rabbitTemplate.convertAndSend("topicMessage","user.error","direct消息:hello user.error!");
        rabbitTemplate.convertAndSend("topicMessage","user.warn","direct消息:hello user.warn!");
        rabbitTemplate.convertAndSend("topicMessage","user.warn.message","direct消息:hello user.warn.message!");

    }
}

消費者:

import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 使用註解設置隊列:@Queue
 * value 爲隊列名
 * durable 爲是否持久化 默認值是true
 * autoDelete 是否自動刪除隊列 默認值是false
 */
@Component

public class TopicCustomerMQ {

    /**
     * @Queue 不加value 表示臨時隊列
     * type = "direct" direct 是默認模式
     * @param message
     */
    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"*.info"})})
    public void receiveMessage1(String message){
        System.out.println("接收到的消息1:"+message);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"user.*"})})
    public void receiveMessage2(String message){
        System.out.println("接收到的消息2:"+message);
    }

    @RabbitListener(bindings = {@QueueBinding(value = @Queue,exchange = @Exchange(value = "topicMessage",type = "topic"),key = {"user.#"})})
    public void receiveMessage3(String message){
        System.out.println("接收到的消息3:"+message);
    }
}

運行結果:

總結

1. SpringBoot 整合RabbitMQ步驟。

2. 簡化了配置邏輯。

3. 啓動系統,消費者也自動被啓動。

4. Spring提供了RabbitTemplate來封裝MQ,最終簡化我們代碼。

5. 相關注解需要掌握。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章