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

rabbitmq延遲隊(duì)列的使用方式

 更新時(shí)間:2024年04月15日 12:17:05   作者:fpl1116  
這篇文章主要介紹了rabbitmq延遲隊(duì)列的使用方式,使用rabbitmq的延時(shí)隊(duì)列插件,實(shí)現(xiàn)同一個(gè)隊(duì)列中有多個(gè)不同超時(shí)時(shí)間的消息,并按時(shí)間超時(shí)順序出隊(duì),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧

rabbitmq延遲隊(duì)列的使用

1、場景:

1.定時(shí)發(fā)布文章
2.秒殺之后,給30分鐘時(shí)間進(jìn)行支付,如果30分鐘后,沒有支付,訂單取消。
3.預(yù)約餐廳,提前半個(gè)小時(shí)發(fā)短信通知用戶。
A -> 13:00 17:00 16:30 延遲時(shí)間: 730 * 60 * 1000
B -> 11:00 18:00 17:30 延遲時(shí)間: 1330 * 60 * 1000
C -> 8:00 14:00 13:30 延遲時(shí)間: 11*30 * 60 * 1000

第一種方式:創(chuàng)建具有超時(shí)功能且綁定死信交換機(jī)的消息隊(duì)列

 @Bean
    public Queue directQueueLong(){
        return   QueueBuilder.durable("業(yè)務(wù)隊(duì)列名稱")
                .deadLetterExchange("死信交換機(jī)名稱")
                .deadLetterRoutingKey("死信隊(duì)列 RoutingKey")
                .ttl(20000) // 消息停留時(shí)間
                //.maxLength(500)
                .build();
    }

監(jiān)聽死信隊(duì)列,即可處理超時(shí)的消息隊(duì)列

缺點(diǎn):
上述實(shí)現(xiàn)方式中,ttl延時(shí)隊(duì)列中所有的消息超時(shí)時(shí)間都是一樣的,如果不同消息想設(shè)置不一樣的超時(shí)時(shí)間,就需要建立多個(gè)不同超時(shí)時(shí)間的消息隊(duì)列,比較麻煩,且不利于維護(hù)。

第二種方式:創(chuàng)建通用延時(shí)消息

rabbitTemplate.convertAndSend("交換機(jī)名稱", "RoutingKey","對象",
	message => {
		message.getMessageProperties().setExpiration(String.valueOf(5000))
			        return message;
	            }
           );

缺點(diǎn):
該種方式可以創(chuàng)建一個(gè)承載不同超時(shí)時(shí)間消息的消息隊(duì)列,但是這種方式有一個(gè)問題,如果消息隊(duì)列中排在前面的消息沒有到超時(shí)時(shí)間,即使后面的消息到了超時(shí)時(shí)間,先到超時(shí)時(shí)間的消息也不會(huì)進(jìn)入死信隊(duì)列,而是先檢查排在最前面的消息隊(duì)列是否到了超時(shí)時(shí)間,如果到了超時(shí)時(shí)間才會(huì)繼續(xù)檢查后面的消息。

第三種方式:使用rabbitmq的延時(shí)隊(duì)列插件,實(shí)現(xiàn)同一個(gè)隊(duì)列中有多個(gè)不同超時(shí)時(shí)間的消息,并按時(shí)間超時(shí)順序出隊(duì)

1、下載延遲插件

在 RabbitMQ 的 3.5.7 版本之后,提供了一個(gè)插件(rabbitmq-delayed-message-exchange)來實(shí)現(xiàn)延遲隊(duì)列 ,同時(shí)需保證 Erlang/OPT 版本為 18.0 之后。
我這里 MQ 的版本是 3.10.0 現(xiàn)在去 GitHub 上根據(jù)版本號下載插件
https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases

2、安裝插件并啟用

我用的是 Docker 客戶端,下載完成后直接把插件放在 /opt/rabbitmq 目錄,然后拷貝到容器內(nèi)plugins目錄下(rabbitmq是容器的name,也可以使用容器id)

docker cp /opt/rabbitmq/rabbitmq_delayed_message_exchange-3.10.0.ez rabbitmq:/plugins

進(jìn)入 Docker 容器

docker exec -it rabbitmq /bin/bash

在plugins內(nèi)啟用插件

#先執(zhí)行,解除防火墻限制,增加文件權(quán)限
cd plugins
umask 0022
rabbitmq-plugins enable rabbitmq_delayed_message_exchange

退出容器

exit

重啟 RabbitMQ

docker restart rabbitmq

通過UI查看

原理

代碼使用

消費(fèi)者

/*
 * Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
 *
 */
package com.fpl.consumers;
import cn.hutool.core.map.MapUtil;
import com.fpl.model.OrderingOk;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
/**
 * <p>Project: spring-rabbitmq - DelayConsumer</p>
 * <p>Powered by fpl1116 On 2024-04-09 11:34:07</p>
 * <p>描述:<p>
 *
 * @author penglei
 * @version 1.0
 * @since 1.8
 */
@Configuration
@Slf4j
public class DelayConsumer {
    @Bean
    public Queue delayQueue1(){
        return   QueueBuilder.durable("Delay_Q01").lazy().build();
    }
    @Bean
    public CustomExchange delayExchange(){
        //參數(shù)x-delayed-type
        Map<String, Object> map = MapUtil.of("x-delayed-type","direct");
        return new CustomExchange("Delay_E01","x-delayed-message",true,false,map);
    }
    @Bean
    public Binding binding1(Queue delayQueue1, CustomExchange delayExchange){
        return BindingBuilder.bind(delayQueue1).to(delayExchange).with("RK01").noargs();
    }
//     @RabbitListener(queues = "Delay_Q01")
    public void receiveMessage(OrderingOk msg) {
        log.info("消費(fèi)者1 收到消息:"+ msg );
    }
}

生產(chǎn)者

/*
 * Copyright (c) 2020, 2024, fpl1116.cn All rights reserved.
 *
 */
package com.fpl.provider;
import com.fpl.model.OrderingOk;
import org.springframework.amqp.AmqpException;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.core.MessageDeliveryMode;
import org.springframework.amqp.core.MessagePostProcessor;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>Project: spring-rabbitmq - DelayProvider</p>
 * <p>Powered by fpl1116 On 2024-04-09 11:35:51</p>
 * <p>描述:<p>
 *
 * @author penglei
 * @version 1.0
 * @since 1.8
 */
@Service
public class DelayProvider {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    public void send(OrderingOk orderingOk) {
        rabbitTemplate.convertAndSend("Delay_E01", "RK01", orderingOk,new MessagePostProcessor(){
            @Override
            public Message postProcessMessage(Message message) throws AmqpException {
                int id  = orderingOk.getId();
                int ttl = 0;
                if(id == 1){
                    ttl = 50*1000;
                }else if(id == 2){
                    ttl = 30*1000;
                }else if(id ==3){
                    ttl = 40*1000;
                }else if(id ==4){
                    ttl = 10*1000;
                }else if(id ==5){
                    ttl = 20*1000;
                }
                //延遲交換機(jī)使用的delay參數(shù),設(shè)置消息的延期時(shí)長,單位是微妙
                message.getMessageProperties().setDelay(ttl);
                //延遲交換機(jī)消息默認(rèn)是持久化的
                message.getMessageProperties().setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT);
                return message;
            }
        });
    }
}

測試

@Test
    void test5() throws IOException {
        for (int i = 1; i <=5;i++){
            OrderingOk orderingOk = OrderingOk.builder().id(i).name("張 " + i).build();
            delayProvider.send(orderingOk);
            System.out.println("發(fā)送成功:"+i);
        }
        System.in.read();
    }

到此這篇關(guān)于rabbitmq延遲隊(duì)列的使用的文章就介紹到這了,更多相關(guān)rabbitmq延遲隊(duì)列內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細(xì)講解Java中的main()方法

    詳細(xì)講解Java中的main()方法

    在java中main()方法是java應(yīng)用程序的入口方法,由此可見main方法是很重要的,那么下面這篇文章就給大家詳解介紹了Java中的main()方法,需要的朋友可以參考下。
    2016-09-09
  • MyBatis中如何獲取Oracle序列

    MyBatis中如何獲取Oracle序列

    文章介紹了在使用MyBatis時(shí),如何通過獲取序列的下一個(gè)值來完成某些功能操作,并在之后進(jìn)行數(shù)據(jù)的添加操作,文中特別強(qiáng)調(diào)了在獲取序列值后不能單獨(dú)執(zhí)行插入操作,否則會(huì)報(bào)錯(cuò)
    2024-12-12
  • java中單雙斜杠的使用圖文詳解

    java中單雙斜杠的使用圖文詳解

    JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,下面這篇文章主要給大家介紹了關(guān)于java中單雙斜杠使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java Stax解析XML示例

    Java Stax解析XML示例

    這篇文章主要介紹了Java Stax解析XML示例,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-09-09
  • 注解@CrossOrigin解決跨域的問題

    注解@CrossOrigin解決跨域的問題

    這篇文章主要介紹了注解@CrossOrigin解決跨域的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法

    Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法

    這篇文章主要介紹了Springcloud-nacos實(shí)現(xiàn)配置和注冊中心的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • 使用SQL保留兩位小數(shù)的實(shí)現(xiàn)方式

    使用SQL保留兩位小數(shù)的實(shí)現(xiàn)方式

    SQL中保留兩位小數(shù)有三種方法:1、使用ROUND()函數(shù)進(jìn)行四舍五入;2、使用CONVERT()函數(shù)和3、CAST()函數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,這兩種方法會(huì)截?cái)喽嘤嗟奈粩?shù),ROUND()函數(shù)會(huì)保留0位,而CONVERT()和CAST()會(huì)刪除多余的0
    2024-11-11
  • 詳解Spring-Boot中如何使用多線程處理任務(wù)

    詳解Spring-Boot中如何使用多線程處理任務(wù)

    本篇文章主要介紹了詳解Spring-Boot中如何使用多線程處理任務(wù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • 使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程

    使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程

    數(shù)據(jù)權(quán)限控制需要對查詢出的數(shù)據(jù)進(jìn)行篩選,對業(yè)務(wù)入侵最少的方式就是利用mybatis或者數(shù)據(jù)庫連接池的切片對已有業(yè)務(wù)的sql進(jìn)行修改,本文給大家介紹了使用mybatis切片實(shí)現(xiàn)數(shù)據(jù)權(quán)限控制的操作流程,需要的朋友可以參考下
    2024-07-07
  • springBoot service層事務(wù)控制的操作

    springBoot service層事務(wù)控制的操作

    這篇文章主要介紹了springBoot service層事務(wù)控制的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評論