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);
           }          
           //其它业务处理
      }
相关推荐
方方洛15 小时前
ray教程-13-RayTrain与分布式训练
人工智能·分布式·机器学习
黄俊懿21 小时前
【架构师从入门到进阶】第七章:缓存和存储的优化思路——第一节:缓存概述
数据结构·数据库·分布式·缓存·架构·系统架构·1024程序员节
红海云21 小时前
两台DGX Spark部署DeepSeek的实战边界
大数据·分布式·spark
GlobalInfo1 天前
上新 | 全球及中国起重机摄像系统行业研究报告(2026版):市场现状、行业前景与占有率分析
大数据·分布式·微服务·ai·相机
方方洛2 天前
ray教程-11-可观测性与调试
人工智能·分布式·机器学习
samforce2 天前
为什么微服务会退化成“分布式单体”?——软件架构里的嵌套率传导定律
人工智能·分布式·微服务·架构·软件架构·结构认知
每天一道题3 天前
Kafka 是如何工作的?从 Broker、Partition、Offset 到 Consumer Group
分布式·kafka
用户1494484813203 天前
为什么大厂很少直接用 2PC/TCC?聊聊分布式事务在真实业务里的落地套路
分布式·后端
code_slave(码畜)3 天前
微服务架构落地:分库分表实战(下) —— 分布式主键、跨分片查询与分页聚合防坑
数据库·spring boot·分布式·spring cloud·微服务·架构·分库分表
德迅云安全-上官3 天前
新一代智能分布式云接入:应用加速守护 TCP 业务安全与体验
分布式·tcp/ip·安全