首页 > 其他分享 >实现延迟队列

实现延迟队列

时间:2023-05-30 11:26:02浏览次数:33  
标签:SX 队列 实现 死信 queueA new public 延迟

原理:利用消息过期后消息进入死信,然后消费者订阅死信队列进行消费达到延迟的功能

 生产者-->交换机01-->过期队列-->消息过期后-->死信交换机-->死行队列-->消费者

 定义配置

@Configuration
public class TTLQueueConfig {

    //region 声明普通类型的交换机和队列

    public static final String PT_EXCHANGENAME="zd.putong.exchange";
    public static final String PT_QUEUEA="zd.putong.queueA";
    public static final String PU_ROUTINGKEY="queueA";

    // 声明普通交换机
    @Bean("ptExchange")
    public DirectExchange ptExchange(){
        return new DirectExchange(PT_EXCHANGENAME);
    }
    // 声明队列 设置该队列ttl 并将其绑定到 死信交换机上
    @Bean("queueA")
    public Queue queueA(){
        Map<String, Object> args = new HashMap<>(3);
        //绑定到死信交换机上
        args.put("x-dead-letter-exchange",SX_EXCHANGENAME);
        //绑定死信路由key
        args.put("x-dead-letter-routing-key",SX_ROUTINGKEY);
        // 设置消息过期时间
        args.put("x-message-ttl",60000);

        return QueueBuilder.durable(PT_QUEUEA).withArguments(args).build();
    };
    // 绑定队列
    @Bean
    public Binding queueABinding(@Qualifier("queueA") Queue queueA, @Qualifier("ptExchange")DirectExchange directExchange){

        return BindingBuilder.bind(queueA).to(directExchange).with(PU_ROUTINGKEY);
    };
    //endregion



    //region 声明死信交换机和队列
    public static final String SX_EXCHANGENAME="zd.sixing.exchange";
    public static final String SX_QUEUEA="zd.sixing.queueA";
    public static final String SX_ROUTINGKEY="zd.sixing.queueA";

    @Bean("sxExchange")
    public DirectExchange sxExchange(){
        return new DirectExchange(SX_EXCHANGENAME);
    }
    @Bean("sxQueueA")
    public Queue queuesxA(){

        return new Queue(SX_QUEUEA,false);
    };
    @Bean
    public Binding sxQueueABinding(@Qualifier("sxQueueA") Queue queueA, @Qualifier("sxExchange")DirectExchange directExchange){

        return BindingBuilder.bind(queueA).to(directExchange).with(SX_ROUTINGKEY);
    };
    //endregion




} 

 

模拟生产者发送消息:

@RequestMapping("/sendMsg")
public String  sendMsg(){
    JSONObject data = new JSONObject();
    data.put("id","0001");
    data.put("msg","我是产生的消息"+System.currentTimeMillis());
    data.put("time",DateUtil.format(new Date(), "yyyy/MM/dd HH:mm:ss"));
    rabbitTemplate.convertAndSend(TTLQueueConfig.PT_EXCHANGENAME,TTLQueueConfig.PU_ROUTINGKEY,data);
    System.out.println("产生消息:"+DateUtil.format(new Date(), "yyyy/MM/dd HH:mm:ss"));
    return "发送成功";

}

模拟消费者接受消息:

@RunWith(SpringRunner.class)
@SpringBootTest()
class RabbitmqApplicationTests {
    @Resource
    private RabbitTemplate rabbitTemplate;
    @Test
    void contextLoads() throws InterruptedException {
        while (true) {
            Thread.sleep(1000);
            Object msg = rabbitTemplate.receiveAndConvert(TTLQueueConfig.SX_QUEUEA);
            if (msg!=null){
                System.out.println("收到消息:"+ DateUtil.format(new Date(), "yyyy/MM/dd HH:mm:ss")+msg);
            }

        }
    }

}

 结果:

//产生消息:2023/05/30 10:51:22
//收到消息:2023/05/30 10:52:23{"msg":"我是产生的消息1685415082519","id":"0001","time":"2023/05/30 10:51:22"}

标签:SX,队列,实现,死信,queueA,new,public,延迟
From: https://www.cnblogs.com/javacx/p/17442697.html

相关文章

  • C# 代码实现关机
    AdvApi32.LookupPrivilegeValue(null,"SeShutdownPrivilege",outvarlpLuid);usingvart=AdvApi32.SafeHTOKEN.FromThread(Kernel32.SafeHTHREAD.Current,AdvApi32.TokenAccess.TOKEN_ADJUST_PRIVILEGES|AdvApi32.TokenAccess.TOKEN_QUERY);varptp=......
  • 界面组件Telerik UI for WPF可轻松实现直方图,让数据可视化更简单
    TelerikUIforWPF拥有超过100个控件来创建美观、高性能的桌面应用程序,同时还能快速构建企业级办公WPF应用程序。UIforWPF支持MVVM、触摸等,创建的应用程序可靠且结构良好,非常容易维护,其直观的API将无缝地集成VisualStudio工具箱中。TelerikUIforWPF|下载试用TelerikUI......
  • Java实现打包压缩文件或文件夹生成zip以实现多文件批量下载
    有时候在系统中需要一次性下载多个文件,但逐个下载文件比较麻烦。这时候,最好的解决办法是将所有文件打包成一个压缩文件,然后下载这个压缩文件,这样就可以一次性获取所有所需的文件了。下面是一个名为CompressUtil的工具类的代码,它提供了一些方法来处理文件压缩和下载操作:importor......
  • 文档在线预览(二)word、pdf文件转html以实现文档在线预览
    @目录一、将文件转换成html字符串1、将word文件转成html字符串2、将pdf文件转成html字符串二、将文件转换成html,并生成html文件FileUtils类将html字符串生成html文件示例:1、将word文件转换成html文件2、将pdf文件转换成html文件实现文档在线预览的方式除了上篇文章《文档在线预览......
  • python实现密码与时间戳的加密
    1.概述:由于工作需要,要对用户的密码进行加密,由于仅是用一种加密方式(例如md5)比较容易被破解,故,我们进行了二次加密,代码如下2.代码实现importdatetimeimporthashlib#待加密信息#加密方法defencryption(pwd):"""加密时间戳(16位)每个数字加6后转为16进制,共1......
  • 2023-05-30 前端h5页面如何实现调起微信支付功能(该回答来自chatgpt,实际效果未测试)
    前端H5页面调起微信支付功能需要结合微信JS-SDK和后端接口实现。以下是基本步骤和示例代码:1.获取微信公众号的appid和secret在微信公众平台上创建一个公众号,获取其对应的appid和secret。2.引入微信JS-SDK将微信JS-SDK的链接放入HTML文件的头部,例如:<scriptsrc="https://res.......
  • 深拷贝的实现
    JavaScript深拷贝的实现;这里记录一下手写递归的方式实现深拷贝创建克隆函数functioncloneDeep(obj){}函数内创建一个变量;用来接数据letnewObj=null判断传入的参数是不是引用数据类型;并且不是空的;满足的条件执行if内的语句if(typeofobj==='obje......
  • Groovy 基于Groovy实现MD5加密
    groovy3.0.7代码实现实现方式1importjava.security.MessageDigest;publicclassMD5Utils{ publicfinalstaticStringMD5(Strings){ char[]hexChars=['0','1','2','3','4','5','6',......
  • python推荐系统实现(矩阵分解来协同过滤)|附代码数据
    原文链接:http://tecdat.cn/?p=10911最近我们被客户要求撰写关于推荐系统的研究报告,包括一些图形和统计输出。用户和产品的潜在特征编写推荐系统矩阵分解工作原理使用潜在表征来找到类似的产品 1.用户和产品的潜在特征我们可以通过为每个用户和每部电影分配属性,然后将它们相......
  • eSpeek实现中文文字转语音功能
      最近业务上面有个文字转语音的想法,搜了下espeak可以实现这部分功能,搞下来试试效果!一、源码包下载  1、下载pa_stable_v190700_20210406.tgz   http://www.portaudio.com/download.html   2、下载espeak-1.48.04-source.zip   http://espeak.source......