欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rabbitmq消息推送功能實現(xiàn)示例

 更新時間:2022年12月27日 10:29:41   作者:十年(Sugar)  
rabbitMQ為異步消息處理提出了一個很好的解決方案,它是一個非常好用的消息中間件。主要解決當生產者大量產生數(shù)據(jù)時,消費者無法快速消費的問題。這個時候需要一個中間層,保存這個數(shù)據(jù),rabbitMQ是一個很好的解決方案

一.前言

1.1場景

在我們實際開發(fā)中到一個特定的時候是比如工作流到某個狀態(tài)時, 我們會向某某單位發(fā)送消息, 這時就會用到我們的消息推送---rabbitmq

簡單畫一下:

1.2消息交換機三種形式

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

  • 直連型:一個交換機關聯(lián)一個隊列,指定一個路由key,消息通過交換機名稱和路由key發(fā)送到指定隊列,發(fā)送一個,隊列里面就多一個消息。
  • 扇型:一個交換機關聯(lián)多個隊列。消息通過交換機名稱發(fā)送,所有關聯(lián)了這個交換機的隊列都將收到消息,發(fā)送一個消息再N個消息隊列產生N個一模一樣的消息數(shù)據(jù)。
  • 主題型:一個交換機根據(jù)規(guī)則關聯(lián)多個隊列。這種類型與扇型的很像,但是主題型會根據(jù)動態(tài)路由key決定消息的投遞到哪個隊列。這里的路由規(guī)則很像正則表達式。會根據(jù)事先設定的路由規(guī)則動態(tài)將消息投遞到隊列,可能投遞到一個隊列也可能投遞到多個隊列。

二.建設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
    #確認消息已發(fā)送到交換機(Exchange)
    publisher-confirm-type: correlated
    #確認消息已發(fā)送到隊列(Queue)
    publisher-returns: true

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

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

2.3直連型消息鏈接

從上面的講解中我們知道,有交換機exchange,有隊列queue,有路由routing,因此我們需要在生產者端將三者關聯(lián)起來,然后發(fā)送消息,這樣消費端才能收到消息。

創(chuàng)建config工作類綁定關聯(lián)

@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);
    }

發(fā)送消息

@Autowired
private RabbitTemplate rabbitTemplate;  //使用RabbitTemplate,這提供了接收/發(fā)送等等方法
@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());
    //交換機 路由 消息(發(fā)送消息的時候不需要管隊列,因為隊列已經在DirectRabbitConfig中配置了,隊列應該是消費者關心的事情)
    rabbitTemplate.convertAndSend(DirectRabbitConfig.directExchange, DirectRabbitConfig.directRouting, map);
    return "ok";
}

第二個工程中: 接收消息

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

到此這篇關于Rabbitmq消息推送功能實現(xiàn)示例的文章就介紹到這了,更多相關Rabbitmq消息推送內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論