Java--高效的定时任务设计

举个例子: 订单服务,当用户提交了订单后,如果在30分钟内没有支付,自动取消订单,这就是一个对状态的管理;

再举一个我实际开发的例子: 消息管道的例子,用户来拉取消息后,如果在30s内没有提交,那么修改他的订阅状态为:未订阅,这样其他的实例可以建立连接继续读取.

 整理设计图:

Java--高效的定时任务设计

核心就是: 一个Thread + 一个Queue;Thread不断从队列中取出数据, 如果队列中为空或者里边的任务没到期,则线程卡住wait(timeOut).

二 详细设计

先是简单的有状态的实体类:ConsumerInfoState,这个类的核心是状态(订阅到期时间),所以得有对状态的查询设置,查询距到期还要多久等等....

import java.io.Serializable; public class ConsumerInfoState implements Serializable { /** * 序列化ID */ private static final long serialVersionUID = 1L; /** * 过期时间20s */ protected long expiration; private String topic; private String userId; private boolean isSubscribed = false; private long CONSUMER_INSTANCE_TIMEOUT_MS_DEFAULT = 5000; public ConsumerInfoState(String userId) { this.userId = userId; this.expiration = System.currentTimeMillis() + CONSUMER_INSTANCE_TIMEOUT_MS_DEFAULT; } public ConsumerInfoState(String topic, String userId) { super(); this.topic = topic; this.userId = userId; this.expiration = System.currentTimeMillis() + CONSUMER_INSTANCE_TIMEOUT_MS_DEFAULT; } /** *是否过期 */ public boolean expired(long nowMs) { return expiration <= nowMs; } /** * <p> * 更新订阅过期时间 * </p> */ public void updateExpiration() { this.expiration = System.currentTimeMillis() + CONSUMER_INSTANCE_TIMEOUT_MS_DEFAULT; } /** * <p> * 到指定时间还有多久 * </p> */ public long untilExpiration(long nowMs) { return this.expiration - nowMs; } public String getUserId() { return userId; } public String getTopic() { return topic; } public void setTopic(String topic) { this.topic = topic; } public void setSubscribed(boolean isSubscribed) { this.isSubscribed = isSubscribed; } public boolean hasSubscribed() { return isSubscribed; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfssy.html