RabbitMQ实现延时队列Demo

**延时队列:**通过死信队列实现,将消息发送至延时队列,设置延时队列的过期时间,例如5秒钟,等待5秒之后,该消息会被放入死信队列,由死信进行转发到普通队列中

简单的配置文件:

spring:
  rabbitmq:
    virtual-host: /
    addresses: localhost
    username: guest
    password: guest
    port: 5672
  application:
    name: consumer-01

配置RabbitMQ的队列以及交换机:

package com.example.consumer01.config;

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author liyunxing
 * @package com.example.consumer01.config
 * @code
 * @description:
 * @since 2019/4/25 9:42
 */
@Configuration
public class RabbitConfig {

    //死信交换机
    public static final String DELAY_EXCHANGE = "delay-exchange";
    //死信路由
    public static final String DELAY_ROUTING_KEY = "delay-routing-key";
    //死信队列
    public static final String DELAY_QUEUE = "delay-queue";

    //普通交换机
    public static final String NORMAL_EXCHANGE = "normal-exchange";
    //普通路由
    public static final String NORMAL_ROUTING_KEY = "normal-routing-key";
    //普通队列
    public static final String NORMAL_QUEUE = "normal-queue";

    /**
     * 创建延时队列
     */
    @Bean
    public Queue getDelayQueue(){
        Map args = new HashMap();
        /**
         * 消息发送给延时队列
         * 设置延时队列的过期时间为5秒钟
         * 5秒之后,延时队列将消息发送给普通队列
         */
        args.put("x-dead-letter-exchange",NORMAL_EXCHANGE);
        args.put("x-dead-letter-routing-key",NORMAL_ROUTING_KEY);
        args.put("x-message-ttl",5000);
        return QueueBuilder.durable(DELAY_QUEUE).withArguments(args).build();
    }
    //创建延时交换机
    @Bean
    public Exchange getDelayExchange(){
        return ExchangeBuilder.directExchange(DELAY_EXCHANGE).durable(true).build();
    }
    //延时与延时交换机进行绑定
    @Bean
    public Binding bindDelay(){
        return BindingBuilder.bind(getDelayQueue()).to(getDelayExchange()).with(DELAY_ROUTING_KEY).noargs();
    }

    //创建普通队列
    @Bean
    public Queue getNormalQueue(){
        return new Queue(NORMAL_QUEUE);
    }
    //创建普通交换机
    @Bean
    public Exchange getNormalExchange(){
        return ExchangeBuilder.directExchange(NORMAL_EXCHANGE).durable(true).build();
    }
    //普通队列与普通交换机进行绑定
    @Bean
    public Binding bindNormal(){
        return BindingBuilder.bind(getNormalQueue()).to(getNormalExchange()).with(NORMAL_ROUTING_KEY).noargs();
    }
}

设置消费者,监听普通队列

package com.example.consumer01.rabbit;

import com.example.consumer01.config.RabbitConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @author liyunxing
 * @package com.example.consumer01.rabbit
 * @code
 * @description:
 * @since 2019/4/25 9:43
 */
@Component
public class Consumer01 {

    //监听延迟队列,将在五秒之后收到消息
    @RabbitListener(queues = {RabbitConfig.NORMAL_QUEUE})
    public void receiver(String msg){
        System.out.println("normal queue 收到消息>>>>>>>>>"+msg);
    }
}

将信息发送至死信队列,消息在死信队列中停留五秒之后,转发到普通队列

package com.example.consumer01;

import com.example.consumer01.config.RabbitConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;

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

    Logger logger = LoggerFactory.getLogger(Consumer01ApplicationTests.class);

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Test
    public void contextLoads() {
        String msg = "hello world";
        /**
         * 发送给普通对队列,设置五秒之后过期
         * 但是并没有实现消费的监听,因此该消息将在五秒之后过期
         */
        rabbitTemplate.convertAndSend(RabbitConfig.DELAY_EXCHANGE,RabbitConfig.DELAY_ROUTING_KEY,msg);
        logger.info("message is {}"+msg);
        }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值