订单超时取消-死信交换机(java)

1.订单交换机、订单队列、死信交换机和死信队列。他们之间的连接关系如下

2.订单生成者代码(这里只做测试,不完成功能)

    @Test
    public void sendOrderMessage(){
        Long orderId = 123L;
        log.debug("订单生成时间为:{}", System.currentTimeMillis() / 1000);
        rabbitTemplate.convertAndSend(MqConfig.ORDER_EXCHANGE, MqConfig.ORDER_KEY, orderId);
    }

2.1.生成订单号

2.2.打印发送消息时间

2.3.发送消息

3.配置所有交换机和队列及其关系代码(测试,这里超时20秒订单队列就会把消息传递给死信交换机)

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;

@Configuration
public class MqConfig {
    // 订单交换机名称
    public static final String ORDER_EXCHANGE = "order.direct";
    // 订单队列名称
    public static final String ORDER_QUEUE = "order.queue";
    // 订单交换机key
    public static final String ORDER_KEY = "order";
    // 死信交换机名称
    public static final String DELAY_EXCHANGE = "delay.direct";
    // 死信队列名称
    public static final String DELAY_QUEUE = "delay.queue";
    // 订单交换机key
    public static final String DELAY_KEY = "delay";

    // 声明订单交换机
    @Bean
    public DirectExchange orderExchange(){
        return new DirectExchange(ORDER_EXCHANGE);
    }

    // 声明死信交换机
    @Bean
    public DirectExchange delayExchange(){
        return new DirectExchange(DELAY_EXCHANGE);
    }

    // 声明订单队列
    @Bean
    public Queue orderQueue(){
        Map<String, Object> map = new HashMap<>();
        //设置队列超时时间
        map.put("x-message-ttl", 1000 * 20);
        //设置死信队列交换机
        map.put("x-dead-letter-exchange", DELAY_EXCHANGE);
        //设置死信队列路由key
        map.put("x-dead-letter-routing-key", DELAY_KEY);
        return new Queue(ORDER_QUEUE,true,false,false, map);
    }

    // 声明死信队列
    @Bean
    public Queue delayQueue(){
        return new Queue(DELAY_QUEUE, true);
    }

    // 订单交换机绑定订单队列
    @Bean
    public Binding orderBinding(Queue orderQueue, DirectExchange orderExchange){
        return BindingBuilder.bind(orderQueue).to(orderExchange).with(ORDER_KEY);
    }

    // 死信交换机绑定死信队列
    @Bean
    public Binding delayBinding(Queue delayQueue, DirectExchange delayExchange){
        return BindingBuilder.bind(delayQueue).to(delayExchange).with(DELAY_KEY);
    }
}

4.消费者监听死信队列代码(这里只做测试,打印当前时间(单位为s)用与对比发送时间)

import com.example.rabbitmq.config.MqConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.ExchangeTypes;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.util.Map;

@Slf4j
@Component
public class MqListener {
    @RabbitListener(queues = MqConfig.DELAY_QUEUE)
    public void listenOrder(Long orderId){
        // TODO 判断订单是否已经完成
        // 这里默认未完成
        log.debug("订单{}超时取消,time:{}", orderId, System.currentTimeMillis() / 1000);
    }
}

5.测试结果

5.1 生产者打印显示

5.2 消费者打印显示

5.3 结果显示,发送者和生成者显示结果刚好相差20s.

  • 12
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

该睡觉了839

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值