订单到期关闭如何实现

订单到期关闭如何实现

理论上来说,订单到期关闭的实现方式可以有:

  • 被动关闭
    参考redis键过期策略“惰性删除”的思想,可以在用户访问订单的时候,再去对到期的订单进行关单操作。但系统后往往还有订单列表的查询,只在访问订单时关闭到期订单会使得订单列表查询结果中订单状态不准确。所以这种方式不合适。
  • 定时任务
    参考redis键过期策略“定期删除”的思想,可以长期维护一个异步线程定期扫描订单表,对到期订单进行关单操作。可以配合xxljob实现。确定是轮询有时间间隔导致到期时间不精确,频繁扫描数据库表也增加了数据库的压力。这种也不合适。
  • MQ延迟队列
    大多数MQ都支持延迟队列,可以在订单生成时向MQ发送一个带过期时间的消息,一个MQ消费者监听延迟队列,订单消息到期时,MQ关单消费者接收到订单消息,对订单进行关单操作。
  • Redisson延迟队列
    基于Redis的zset实现的延迟队列也可以做到MQ延迟队列的功能。

RabbitMQ延迟队列实现

使用RabbitMQ延迟队列实现的过程是:

  1. 向普通交换机发送一个带有过期时间的消息;
  2. 交换机根据routekey把带过期时间的消息放入绑定的普通队列中;
  3. 消息在普通队列中过期时,被发送到普通队列配置的死信交换机;
  4. 死信交换机根据routekey把过期消息放入绑定的死信队列中;
  5. 监听死信队列的关单消费者收到过期消息进行关单操作;
    在这里插入图片描述
@Configuration
public class RabbitConfig {
   
	/**
	 * 订单延迟队列队列所绑定的交换机
	 */
	@Bean
	DirectExchange orderTtlExchange() {
   
		return (DirectExchange) ExchangeBuilder
				.directExchange("order.exchange.ttl")
				.durable(true)
				.build();
	}

	/**
	 * 订单延迟队列
	 */
	@Bean
	public Queue orderTtlQueue() {
   
		return QueueBuilder
				.durable("order.queue.ttl")
				.build();
	}

	/**
	 * 将订单延迟队列绑定到交换机
	 */
	@Bean
	Binding orderTtlBinding(DirectExchange orderTtlDirect, Queue orderTtlQueue) {
   
		return BindingBuilder
				.bind(orderTtlQueue)
				.to(orderTtlDirect)
				.with("order.key.ttl");
	}
	
	/**
	 * 订单消息实际消费队列所绑定的交换机
	 */
	@Bean
	DirectExchange orderExchange() {
   
		return (DirectExchange) ExchangeBuilder
				.directExchange("order.exchange.cancel")
				.durable(true)
				.build();
	}

	/**
	 * 订单实际消费队列
	 */</
在Java中实现到期提醒功能,通常会结合日期处理库如`java.time`或者第三方库如`Quartz`、`Spring Scheduler`等。以下是一个简单的步骤说明: 1. **创建日期对象**:首先,你需要确定过期日期,可以使用`LocalDate`, `LocalDateTime`或`ZonedDateTime`等类来表示。 ```java LocalDate expirationDate = LocalDate.now().plusDays(30); // 过期日期设为当前日期+30天 ``` 2. **定时任务**:你可以使用`java.util.Timer`或者`ScheduledExecutorService`来定期检查是否到达过期日期。如果使用第三方库,如`Quartz`,则创建一个Job并设置其触发规则。 ```java // 使用Quartz示例 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); DateTrigger trigger = new DateTrigger.Builder() .withIntervalInMilliseconds(86400000) // 每天一次,间隔一天毫秒数 .startNow() // 开始立即执行 .build(); scheduler.scheduleJob(new ExpirationCheckJob(expirationDate), trigger); ``` 3. **检查和提醒**:在`ExpirationCheckJob`中,你会检查当前日期是否超过过期日期,并提供相应的提醒机制。这可能是打印日志、发送邮件或者弹窗通知。 ```java public class ExpirationCheckJob implements Job { private LocalDate expiration; public ExpirationCheckJob(LocalDate expiration) { this.expiration = expiration; } @Override public void execute(JobExecutionContext context) { if (LocalDate.now().isAfter(expiration)) { System.out.println("警告:过期日期已到,请处理!"); // 提供其他提醒逻辑... } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值