RabbitMq 实现延时队列-Springboot版本

rabbitmq本身没有实现延时队列,但是可以通过死信队列机制,自己实现延时队列;

原理:当队列中的消息超时成为死信后,会把消息死信重新发送到配置好的交换机中,然后分发到真实的消费队列;

步骤:

1、创建带有时限的队列 dealLineQueue;

2、创建死信Faout交换机dealLineExchange;

3、创建消费队列realQueue,并和dealLineExchange绑定

4、配置dealLineQueue 的过期时间,消息过期后的死信交换机,重发的routing-key;

以下以springboot为例子贴出代码

项目结构:

基本值-DealConstant

package com.eyjian.rabbitmq.dealline;

public interface DealConstant {

    String DEAL_LINE_QUEUE = "dealLineQueue";

    String DEAL_LINE_EXCHANGE = "dealLineExchange";

    String REAL_QUEUE= "realQueue";

}

消费者Lister
package com.eyjian.rabbitmq.dealline;

import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * 死信队里模拟延时队列
 * @Author: yeyongjian
 * @Date: 2019-05-18 14:12
 */
@Component
public class Lister {
    @RabbitListener(queues = DealConstant.REAL_QUEUE)
    public void handle(Message message){
        byte[] body = message.getBody();
        String msg = new String(body);
        System.out.println(msg);

    }
}

配置类RabbitmqConfig



package com.eyjian.rabbitmq.dealline;

import com.rabbitmq.client.Channel;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class RabbitmqConfig {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    //启动初始化删除绑定用的
//    @PostConstruct
    public void delete() throws IOException {
        Channel channel = rabbitTemplate.getConnectionFactory().createConnection().createChannel(true);
        channel.queueUnbind(DealConstant.REAL_QUEUE,DealConstant.DEAL_LINE_EXCHANGE,"");
    }
    @Bean
    public Queue initDealLineQueue() {
        Map<String, Object> args = new HashMap<>();
        args.put("x-dead-letter-exchange", DealConstant.DEAL_LINE_EXCHANGE);
        args.put("x-dead-letter-routing-key", DealConstant.DEAL_LINE_QUEUE);//超时转发的队列
        args.put("x-message-ttl", 5000);//延时时间
        Queue queue = new Queue(DealConstant.DEAL_LINE_QUEUE,true,false,false,args);
        return queue;
    }
    @Bean
    FanoutExchange dealLineExchange() {
        return new FanoutExchange(DealConstant.DEAL_LINE_EXCHANGE);
    }
    @Bean
    Binding bindingiVewUgcTopicExchange(Queue initRealQueue, FanoutExchange dealLineExchange) {
        return BindingBuilder.bind(initRealQueue).to(dealLineExchange);
    }
    @Bean
    public Queue initRealQueue() {
        return new Queue(DealConstant.REAL_QUEUE);
    }

}

application.properties文件

spring.rabbitmq.addresses=localhost
spring.rabbitmq.host=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest


项目启动后,rabbitmq控制台信息如下:

 
 

test类发送消息

package com.eyjian.rabbitmq;

import com.eyjian.rabbitmq.dealline.DealConstant;
import com.rabbitmq.client.Channel;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.IOException;

@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitmqLearnApplicationTests {

    @Autowired
    RabbitTemplate rabbitTemplate;
    @Test
    public void contextLoads() throws IOException {
        rabbitTemplate.convertAndSend(DealConstant.DEAL_LINE_QUEUE,"hell word");
    }

}

5秒后控制台打印消息

源码地址:https://github.com/hd-eujian/rabbitmq-learn.git

原文地址:https://www.cnblogs.com/yeyongjian/p/10886347.html

时间: 2024-10-10 20:04:17

RabbitMq 实现延时队列-Springboot版本的相关文章

基于rabbitMQ 消息延时队列方案 模拟电商超时未支付订单处理场景

前言 传统处理超时订单 采取定时任务轮训数据库订单,并且批量处理.其弊端也是显而易见的:对服务器.数据库性会有很大的要求,并且当处理大量订单起来会很力不从心,而且实时性也不是特别好 当然传统的手法还可以再优化一下,即存入订单的时候就算出订单的过期时间插入数据库,设置定时任务查询数据库的时候就只需要查询过期了的订单,然后再做其他的业务操作 jdk延迟队列 DelayQueue 采取jdk自带的延迟队列能很好的优化传统的处理方案,但是该方案的弊.端也是非常致命的,所有的消息数据都是存于内存之中,一旦

RabbitMQ实现延时队列(死信队列)

基于队列和基于消息的TTL TTL是time to live 的简称,顾名思义指的是消息的存活时间.rabbitMq可以从两种维度设置消息过期时间,分别是队列和消息本身. 队列消息过期时间-Per-Queue Message TTL: 通过设置队列的x-message-ttl参数来设置指定队列上消息的存活时间,其值是一个非负整数,单位为微秒.不同队列的过期时间互相之间没有影响,即使是对于同一条消息.队列中的消息存在队列中的时间超过过期时间则成为死信. 死信交换机DLX 队列中的消息在以下三种情况

Rabbitmq的延时队列的使用

配置: spring: rabbitmq: addresses: 192.168.108.128:5672 connection-timeout: 15000 username: guest password: guest publisher-confirms: true publisher-returns: true 依赖: <!--rabbitmq --> <dependency> <groupId>org.springframework.boot</grou

springboot-rabbitmq:实现延时队列

延时队列应用于什么场景 延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 网上商城下订单后30分钟后没有完成支付,取消订单(如:淘宝.去哪儿网)    系统创建了预约之后,需要在预约时间到达前一小时提醒被预约的双方参会    系统中的业务失败之后,需要重试 这些场景都非常常见,我们可以思考,比如第二个需求,系统创建了预约之后,需要在预约时间到达前一小时提醒被预约的双方参会.那么一天之中肯定是会有很多个预约的

springboot使用RabbitMQ实现延时任务

延时队列顾名思义,即放置在该队列里面的消息是不需要立即消费的,而是等待一段时间之后取出消费.那么,为什么需要延迟消费呢?我们来看以下的场景 订单业务: 在电商/点餐中,都有下单后 30 分钟内没有付款,就自动取消订单.短信通知: 下单成功后 60s 之后给用户发送短信通知.失败重试: 业务操作失败后,间隔一定的时间进行失败重试. 本文基于springboot,使用rabbitmq_delayed_message_exchange插件实现延时队列(RabbitMQ及其插件环境安装点此),具体实践如

spring boot Rabbitmq集成,延时消息队列实现

本篇主要记录Spring boot 集成Rabbitmq,分为两部分, 第一部分为创建普通消息队列, 第二部分为延时消息队列实现: spring boot提供对mq消息队列支持amqp相关包,引入即可: [html] view plain copy <!-- rabbit mq --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-

RabbitMQ:伪延时队列

目录 一.什么是延时队列 二.RabbitMQ实现 三. 延时队列的问题 四.解决RabbitMQ的伪延时方案 ps:伪延时队列先卖个关子,我们先了解下延时队列. 一.什么是延时队列 所谓延时队列是指消息push到队列后,监听的消费者不能第一时间获取消息,需要等到指定时间才能消费. 一般在业务里面需要对某些消息做定时发送,不想走定时任务或者是用户下单之后多长时间自动失效类似的场景可以考虑通过延时队列实现. 二.RabbitMQ实现 MQ本身并不支持直接的延时队列实现,但是我们可以通过Rabbit

RabbitMQ分布式消息队列服务器(一、Windows下安装和部署)

RabbitMQ消息队列服务器在Windows下的安装和部署-> 一.Erlang语言环境的搭建 RabbitMQ开源消息队列服务是使用Erlang语言开发的,因此我们要使用他就必须先进行Erlang语言环境的搭建,其实是非常简单的. 登录Erlang官网,进入下载页,官网地址->http://www.erlang.org/downloads 然后按照自己的系统环境来选择需要下载的安装文件. 我选择 64-bit下载包,因为我的操作系统是64位的 接下来我们需要对Erlang语言的环境变量的配

如何基于RabbitMQ实现优先级队列

概述 由于种种原因,RabbitMQ到目前为止,官方还没有实现优先级队列,只实现了Consumer的优先级处理. 但是,迫于种种原因,应用层面上又需要优先级队列,因此需求来了:如何为RabbitMQ加入优先级队列特性. 查询资料后,得知RabbitMQ虽然官方没有支持此特性,但是社区已经有相关优先级队列插件了,并且这个插件被列在RabbitMQ官方网站中了. 地址如下:http://www.rabbitmq.com/community-plugins.html 插件安装 不要立刻下载这个url中