关闭超时订单和七天自动确认收货+RabbitMQ规范

关闭超时订单

创建订单之后的一段时间内未完成支付而关闭订单的操作,该功能一般要求每笔订单的超时时间是一致的

TTL(Time To Live)存活时间,只能被设置为某个固定的值,不能更改,否则抛出异常
死信(当消息达到过期时间还没有被消费,那么该消息就“死了”)

消息变为死信的条件:

  • 消息被拒绝,并且requeue=false
  • 消息的过期时间到期了
  • 队列达到最大长度

死信交换机:Dead-Letter-Exchange,简称 DLX

  • 当消息在一个队列中变成死信之后,如果这个消息所在的队列设置了 x-dead-letter-exchange参数,那么它会被发送到 x-dead-letter-exchange对应值的交换机上,这个交换机就称之为死信交换机,与这个死信交换器绑定的队列就是死信队列。
  • x-dead-letter-exchange:出现死信之后将死信重新发送到指定交换机
  • x-dead-letter-routing-key:出现死信之后将死信重新按照指定的 routing-key 发送,如果不设置默认使用消息本身的 routing-key

在这里插入图片描述

  1. 生产者发送带有ttl的消息放入交换机路由到延时队列
  2. 延时队列绑定死信交换机与死信转发的routing-key
  3. 等延时队列中的消息达到延时时间之后变成死信转发到死信交换机并路由到死信队列中
  4. 最后供消费者消费

①、配置类

@Configuration
public class DelayQueueRabbitConfig{
   
	
	public static final String DLX_QUEUE = "queue.dlx";//死信队列
	public static final String DLX_EXCHANGE = "exchange.dlx";//死信交换机
	public static final String DLX_ROUTING_KEY = "routingkey.dlx";//死信队列与死信交换机绑定的routing-key
	
	public static final String ORDER_QUEUE = "queue.order";//订单的延时队列
	public static final String ORDER_EXCHANGE = "exchange.order";//订单交换机
	public static final String ORDER_ROUTING_KEY = "routingkey.order";//延时队列与订单交换机绑定的routing-key

	//定义死信队列
	@Bean
	public Queue dlxQueue(){
   
		return new Queue(DLX_queue,true);
	}

	//定义死信交换机
	@Bean
	public DirectExchange dlxExchange(){
   
		return new DirectExchange(DLX_EXCHANGE,true,false);
	}

	//死信交换机和死信队列绑定
	@Bean
	Binding bindingDLX(){
   
		return BindingBuilder.bind(dlxQueue()).to(dlxExchange()).with(DLX_ROUTING_KEY);
	}

	//订单延时队列
	//设置队列里的死信转发到的DLX名称,设置死信在转发时携带的routing-key名称
	@Bean
	public Queue orderQueue(){
   
		Map<String,Object> params = new HashMap<>();
		params.put("x-dead-letter-exchange", DLX_EXCHANGE);
		params.put("x-dead-letter-routing-key", DLX_ROUTING_KEY);
		return new Queue(ORDER_QUEUE, true, false, false, params);
	}

	//订单交换机
	@Bean
	public DirectExchange orderExchange(){
   
		return new DirectExchange(ORDER_EXCHANGE,true,false);
	}

	//把订单队列和订单交换机绑定一块
	@Bean
	public Binding orderBinding(){
   
		return BindingBuilder.bind(orderQueue()).to(orderExchange()).with(ORDER_ROUTING_KEY);
	}
}

②、发送消息

@RequestMapping("/order")
public class OrderSendMessageController{
   
	
	@Autowired
	private RabbitTemplate rabbitTemplate;

	@GetMapping("/sendMessage")
	public String sendMessage(){
   
	
		String delayTime = "10000";
		
		rabbitTemplate.convertAndSend(DelayQueueRabbitConfig.ORDER_EXCHANGE, DelayQueueRabbitConfig.O
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值