RabbitMQ延时队列解决方案demo


/**
     * 监听者 监听延时消息
     */
@Slf4j
@Component
public class MessageListener {


    @Resource
    private OrderReturnService returnService;



    @RabbitListener(queues = RabbitMqConfig.ORDER_CANCEL_DEAD_QUEUE1)
    @Transactional
    public void listenerDeadLetter1(String orderId){
        returnService.cancelOrderReturn(orderId, 2);
        log.info("监听到 =======>>>>> {} 申请7天后商家未处理,则自动同意", orderId);
    }


}
/**
 * 消息队列相关配置
 */
@Configuration
public class RabbitMqConfig {
    //需要改延迟时间 改该参数即可 1000*60为60s延迟 以此类推
    private static int ORDER_CANCEL_TIME1 = 1000*60*60*24*7;
    public static String ORDER_CANCEL_DELAY_ROUTINGKEY1 = "orderCancelRoutingkey1";
    public static String ORDER_CANCEL_DEAD_ROUKEY1 = "orderCancelDeadRoukey1";
    public static final String ORDER_CANCEL_DELAY_QUEUE1 = "orderCancelDelayQueue1";
    public static final String ORDER_CANCEL_DELAY_EXCHANGE1 = "delayExchange1";
    public static final String ORDER_CANCEL_DEAD_QUEUE1 = "deadLetterQueue11";
    public static final String ORDER_CANCEL_DEAD_EXCHANGE1 = "orderCancelDeadLetterExchange1";



    // 声明延时Exchange
    @Bean(ORDER_CANCEL_DELAY_EXCHANGE1)
    public DirectExchange delayExchange1(){
        return new DirectExchange(ORDER_CANCEL_DELAY_EXCHANGE1);
    }

    // 声明死信Exchange
    @Bean(ORDER_CANCEL_DEAD_EXCHANGE1)
    public DirectExchange deadLetterExchange1(){
        return new DirectExchange(ORDER_CANCEL_DEAD_EXCHANGE1);
    }

    // 声明延时队列A 延时7天  1000*60为60s 再*60为一小时 再*24*7为7天
    // 并绑定到对应的死信交换机
    @Bean(ORDER_CANCEL_DELAY_QUEUE1)
    public Queue delayQueue11(){
        Map<String, Object> args = new HashMap<>(3);
        // x-dead-letter-exchange    这里声明当前队列绑定的死信交换机
        args.put("x-dead-letter-exchange", ORDER_CANCEL_DEAD_EXCHANGE1);
        // x-dead-letter-routing-key  这里声明当前队列的死信路由key
        args.put("x-dead-letter-routing-key", ORDER_CANCEL_DEAD_ROUKEY1);
        // x-message-ttl  声明队列的TTL
        args.put("x-message-ttl", ORDER_CANCEL_TIME1);
        return QueueBuilder.durable(ORDER_CANCEL_DELAY_QUEUE1).withArguments(args).build();
    }

    // 声明死信队列 用于接收延时60s处理的消息
    @Bean(ORDER_CANCEL_DEAD_QUEUE1)
    public Queue deadLetterQueueB1(){
        return new Queue(ORDER_CANCEL_DEAD_QUEUE1);
    }

    // 声明延时队列 绑定关系
    @Bean
    public Binding delayBindingA1(@Qualifier(ORDER_CANCEL_DELAY_QUEUE1) Queue queue,
                                 @Qualifier(ORDER_CANCEL_DELAY_EXCHANGE1) DirectExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_CANCEL_DELAY_ROUTINGKEY1);
    }

    // 声明死信队列 绑定关系
    @Bean
    public Binding deadLetterBindingA1(@Qualifier(ORDER_CANCEL_DEAD_QUEUE1) Queue queue,
                                      @Qualifier(ORDER_CANCEL_DEAD_EXCHANGE1) DirectExchange exchange){
        return BindingBuilder.bind(queue).to(exchange).with(ORDER_CANCEL_DEAD_ROUKEY1);
    }


}
/*
 * 代码块 需要执行延迟的消息
 */

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;


@RestController
public class TestController{

    @Autowired
    private RabbitTemplate rabbitTemplate;

    
    @GetMapping(value = "/test/{orderId}")
    public void test(@PathVariable("id")String orderId) {
        System.out.println("订单"+orderId+"开始进入队列,时间:"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        rabbitTemplate.convertAndSend(RabbitMqConfig.ORDER_CANCEL_DELAY_EXCHANGE1, RabbitMqConfig.ORDER_CANCEL_DELAY_ROUTINGKEY1, id);
        
    }
}
<dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
            <version>2.1.3.RELEASE</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-tx</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-expression</artifactId>
                    <groupId>org.springframework</groupId>
                </exclusion>
            </exclusions>
        </dependency>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值