首頁 > 軟體

Rabbitmq訊息推播功能實現範例

2022-12-27 14:00:31

一.前言

1.1場景

在我們實際開發中到一個特定的時候是比如工作流到某個狀態時, 我們會向某某單位傳送訊息, 這時就會用到我們的訊息推播---rabbitmq

簡單畫一下:

1.2訊息交換機三種形式

首先我們瞭解下訊息佇列是由交換機exchange和佇列組合構成的,有三種形式

  • 直連型:一個交換機關聯一個佇列,指定一個路由key,訊息通過交換機名稱和路由key傳送到指定佇列,傳送一個,佇列裡面就多一個訊息。
  • 扇型:一個交換機關聯多個佇列。訊息通過交換機名稱傳送,所有關聯了這個交換機的佇列都將收到訊息,傳送一個訊息再N個訊息佇列產生N個一模一樣的訊息資料。
  • 主題型:一個交換機根據規則關聯多個佇列。這種型別與扇型的很像,但是主題型會根據動態路由key決定訊息的投遞到哪個佇列。這裡的路由規則很像正規表示式。會根據事先設定的路由規則動態將訊息投遞到佇列,可能投遞到一個佇列也可能投遞到多個佇列。

二.建設demo工程

2.1依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2yml檔案指定rabbitmq連線資訊

server:
  port: 8021
spring:
  #給專案來個名字
  application:
    name: rabbitmq-provider
  #設定rabbitMq 伺服器
  rabbitmq:
    host: localhost
    port: 5672
    #確認訊息已傳送到交換機(Exchange)
    publisher-confirm-type: correlated
    #確認訊息已傳送到佇列(Queue)
    publisher-returns: true

注意:我們需要建立兩個工程,一個生產者producer、一個消費者comsumer,生產者用來生產訊息,消費者用來消費生產者將訊息投遞到rabbitmq中的訊息。

兩個工程中的pom依賴一樣,yml也一樣,只需要將server.port設定成不同的埠即可。這裡我們將生產者設定為8021埠,消費者設定為8022埠。

2.3直連型訊息連結

從上面的講解中我們知道,有交換機exchange,有佇列queue,有路由routing,因此我們需要在生產者端將三者關聯起來,然後傳送訊息,這樣消費端才能收到訊息。

建立config工作類繫結關聯

@Configuration
public class Config {
    public static String directRouting = "directRouting";
    public static String directQueue = "directQueue";
    public static String directExchange = "directExchange";
    @Bean
    public Queue DirectQueue() {
        return new Queue(Config.directQueue,true);  //true 是否持久
    }
    @Bean
    DirectExchange DirectExchange() {
        return new DirectExchange(Config.directExchange);
    }
    @Bean
    Binding bindingDirect() {
//        BindingBuilder.bind(佇列A).to(交換機B).with(路由) 將佇列A繫結到交換機B,使用路由C傳遞訊息
        return BindingBuilder.bind(DirectQueue()).to(DirectExchange()).with(directRouting);
    }

傳送訊息

@Autowired
private RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,這提供了接收/傳送等等方法
@GetMapping("/sendDirectMsg")
public String sendMsg() {
    Map<String,Object> map=new HashMap<String,Object>();
    map.put("id",UUID.randomUUID().toString());
    map.put("data","hello,i am direct msg!");
    map.put("datetime",System.currentTimeMillis());
    //交換機 路由 訊息(傳送訊息的時候不需要管佇列,因為佇列已經在DirectRabbitConfig中設定了,佇列應該是消費者關心的事情)
    rabbitTemplate.convertAndSend(DirectRabbitConfig.directExchange, DirectRabbitConfig.directRouting, map);
    return "ok";
}

第二個工程中: 接收訊息

@Component
@RabbitListener(queues = "directQueue")//監聽的佇列名稱 directQueue,不需要管路由和交換機,因為這些是生產者管理的事情。消費者只需要關心佇列即可
public class DirectReceiver {
    @RabbitHandler
    public void handler(Map testMessage) {
        System.out.println("directReceiver消費者收到訊息  : " + testMessage.toString());
    }
}

到此這篇關於Rabbitmq訊息推播功能實現範例的文章就介紹到這了,更多相關Rabbitmq訊息推播內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com