Rabbitmq 死信取消超时订单

本文使用的版本

  • otp_win64_25.0
  • rabbitmq-server-3.11.26
  • rabbitmq插件 rabbitmq_delayed_message_exchange-3.11.1

pom.xml文件

xml 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
	<groupId>com.rabbitmq</groupId>
	<artifactId>amqp-client</artifactId>
	<version>5.11.0</version>
</dependency>

OrderTimeOutCancelConfig.java

java 复制代码
@Configuration
@Data
public class OrderTimeOutCancelConfig {
    /**
     * 正常订单队列,此队列不要绑定消费者,否自无法进入死信队列
     */
    @Bean
    public Queue orderQueue() {
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-message-ttl", 10000);//超时关闭时间10s
        arguments.put("x-dead-letter-exchange", RabbitConstants.ORDER_DLX_EXCHANGE);
        arguments.put("x-dead-letter-routing-key", RabbitConstants.ORDER_DLX_ROUTING_KEY);
        Queue queue = new Queue(RabbitConstants.ORDER_QUEUE, true, false, false, arguments);
        return queue;
    }
	/**
     * 自定义交换机
     */
    @Bean
    public CustomExchange orderExchange() {
        Map<String, Object> arguments = new HashMap<>();
        arguments.put("x-delayed-type", ExchangeTypes.TOPIC);
        return new CustomExchange(RabbitConstants.ORDER_EXCHANGE, "x-delayed-message", true, false, arguments);
    }
	/**
     * 绑定交换机和队列
     */
    @Bean
    public Binding orderRouting() {
        return BindingBuilder
                .bind(orderQueue())
                .to(orderExchange())
                .with(RabbitConstants.ORDER_ROUTING_KEY)
                .noargs();
    }

    /**
     * 订单死信队列
     * @return {@link Queue}
     */
    @Bean
    public Queue orderDlxQueue() {
        Queue queue = new Queue(RabbitConstants.ORDER_DLX_QUEUE, true, false, false);
        return queue;
    }
	/**
     * 死信交换机
     */
    @Bean
    public Exchange orderDlxExchange() {
        return new DirectExchange(RabbitConstants.ORDER_DLX_EXCHANGE, true, false, null);
    }
	/**
     * 绑定
     */
    @Bean
    public Binding orderDlxRouting() {
        return BindingBuilder
                .bind(orderDlxQueue())
                .to(orderDlxExchange())
                .with(RabbitConstants.ORDER_DLX_ROUTING_KEY)
                .noargs();
    }
}
java 复制代码
@Component
@Slf4j
public class OrderCancelHandler {

	/**
	*	监听订单死信队列,关闭订单
	*/
    @RabbitListener(queues = RabbitConstants.ORDER_DLX_QUEUE, ackMode = "MANUAL")
    public void onMessage(Message message, Channel channel) throws IOException {
       log.info("消息进入死信队列...");
        String thdTransFlow = new String(message.getBody());
        log.info(thdTransFlow + "订单取消");
        // 手动ack
        channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
    }
}

OrderService.java

@Resource

java 复制代码
	private AmqpTemplate amqpTemplate;
	public R purchase(){
		//其它业务处理
           //放入队列
           try {
               amqpTemplate.convertAndSend(RabbitConstants.ORDER_EXCHANGE, RabbitConstants.ORDER_ROUTING_KEY, thdTransFlow.getBytes());   //使用上面默认时间
            // 放入死信队列    需要指定其它过期时间时,根据需求二选一即可
           //Integer delayTime = 10 * 1000;
           //amqpTemplate.convertAndSend(RabbitConstants.ORDER_EXCHANGE, RabbitConstants.ORDER_ROUTING_KEY, thdTransFlow, message -> {
               //message.getMessageProperties().setDelay(delayTime);
               //return message;
           //}); 
           } catch (AmqpException e) {
               log.error("放入取消队列出现异常{}",e.getMessage());
               //throw new RuntimeException(e);
           }          
           //其它业务处理
      }
相关推荐
qq_124987075311 分钟前
基于Hadoop的健康饮食推荐系统的设计与实现(源码+论文+部署+安装)
大数据·hadoop·分布式·信息可视化·毕业设计·计算机毕业设计
2501_9418043238 分钟前
从单机限流到分布式动态流控高可用体系落地的互联网系统工程实践随笔与多语言语法思考
rabbitmq·memcached
2501_941800881 小时前
面向微服务分布式事务与可靠一致性的互联网系统高可用设计与多语言工程实践分享
rabbitmq
qq_455760851 小时前
redis - 分布式锁
数据库·redis·分布式
kimi-2221 小时前
Accelerate 是由 Hugging Face 开发的一个轻量级 Python 库,旨在让 PyTorch 的分布式训练变得极其简单
pytorch·分布式·python
最贪吃的虎1 小时前
【分布式】分布式事务概念和理论模型
分布式
五阿哥永琪1 小时前
Redisson 核心数据结构与分布式组件实战手册
数据结构·windows·分布式
你好龙卷风!!!1 小时前
SpringCloud微服务 )分布式锁之redisson
分布式·spring cloud·微服务
独自破碎E2 小时前
说说RabbitMQ的基本架构
架构·rabbitmq·java-rabbitmq
云技纵横2 小时前
分布式 SAGA 模式全解与 Java 入门示例
java·开发语言·分布式