rabbitmq延迟队列案例

  1. 导入maven依赖,添加配置properties
  2. 创建延迟队列的config,包括但不限于声明交换机、声明队列、绑定。
  3. 创建生产者,以SpringBoot Controller为例
  4. 创建消费者

1.添加配置properties

参考
配置properties

2.创建延迟队列的config

@Configuration
public class DelayedQueueConfig {
    //延迟交换机
    public static final String DELAYED_EXCHANGE_NAME = "delayedExchange";

    //延迟队列
    public static final String DELAYED_QUEUE_NAME = "delayedQueue";

    //routingKey
    public static final String DELAYED_ROUTING_KEY = "routingKey";

    //声明交换机 基于插件
    @Bean
    public CustomExchange delayedExchange(){
        Map<String,Object> argument = new HashMap<>();
        argument.put("x-delayed-type","direct");
        /**
         * 1.交换机名字
         * 2.交换机类型
         * 3.是否需要持久化
         * 4.是否需要自动删除
         * 5.其他参数
         */
        return new CustomExchange(DELAYED_EXCHANGE_NAME,"x-delayed-message",true,false,argument);
    }

    //声明队列
    @Bean
    public Queue delayedQueue(){
        return new Queue(DELAYED_QUEUE_NAME);
    }

    //绑定
    @Bean
    public Binding delayedQueueBindingDelayedExchange(){
        return BindingBuilder.bind(delayedQueue()).to(delayedExchange()).with(DELAYED_ROUTING_KEY).noargs();
    }
}

3.创建生产者

@Slf4j
@RestController
@RequestMapping("/ttl")
public class SendMessageController {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/sendExpirationMsg/{message}/{delayedTime}")
    public void sedMsg(@PathVariable String message,@PathVariable Integer delayedTime){
        log.info("发送消息时间{},延迟时间为{}ms,消息为{}",new Date().toString(),delayedTime,message);
        /**
         * 1.交换机
         * 2.routingKey
         * 3.消息
         * 4.其他配置
         */
        rabbitTemplate.convertAndSend(DelayedQueueConfig.DELAYED_EXCHANGE_NAME,
                DelayedQueueConfig.DELAYED_ROUTING_KEY,message,msg->{
            //发送消息的延迟时长 单位:ms
            msg.getMessageProperties().setDelay(delayedTime);
            return msg;
        });
    }
}

4.创建消费者

@Slf4j
@Component
public class DelayedQueueConsumer {
    @RabbitListener(queues=DelayedQueueConfig.DELAYED_QUEUE_NAME)
    public void receiveDelayedQueue(Message message){
        String msg = new String(message.getBody());
        log.info("当前时间:{},收到的消息:{}",new Date().toString(),msg);
    }
}

5.输出结果

输入1:http://localhost:8081/demo/ttl/sendExpirationMsg/message1/20000
输入2:http://localhost:8081/demo/ttl/sendExpirationMsg/message2/2000

输出:
发送消息时间Sat Sep 24 15:17:57 CST 2022,延迟时间为20000ms,消息为message1
发送消息时间Sat Sep 24 15:18:04 CST 2022,延迟时间为2000ms,消息为message2
当前时间:Sat Sep 24 15:18:06 CST 2022,收到的消息:message2
当前时间:Sat Sep 24 15:18:17 CST 2022,收到的消息:message1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值