应用场景
- 定时任务重试
- 回调业务时的延时计算
定义工具类
public int returnTimeInterval(int num) {
int timeInterval[] = {0, 5, 5,
15, 15,
30, 60, 180, 1800,
3600, 3600, 3600, 3600, 3600,
3600, 3600, 3600, 3600, 3600,
3600, 3600, 3600, 3600, 3600,
3600, 3600, 3600, 3600,
3600, 3600, 3600, 3600, 3600};
if (num < timeInterval.length) {
return timeInterval[num];
} else {
return 36000000;
}
}
使用方法
t.setNextNotifyTime(System.currentTimeMillis() + returnTimeInterval(t.getNotifyNum()) * 1000); t.setNotifyNum(t.getNotifyNum() + 1);
举例:
简单的基于数据库的任务处理方法,当任务数量不太多,也不太关注是否及时时可以使用
任务状态枚举类
public enum TaskStatus {
NEW(0),
SUCCSS(1),
FAIL(2),
;
private int v;
public static TaskStatus vOf(int v) {
for (TaskStatus value : TaskStatus.values()) {
if (v == value.v) {
return value;
}
}
return null;
}
TaskStatus(int v) {
this.v = v;
}
public int getV() {
return v;
}
}
任务存储
表结构(任务相关):id, notify_state, notify_num, next_notify_time, max_notify_num, finish_time
任务拉取
// SQL查询语句
select id
from t_xx_task
where notify_num <![CDATA[>=]]> #{startNum} and notify_num <![CDATA[<]]> #{endNum}
and next_notify_time <![CDATA[<=]]> #{currentTime} and notify_state != #{notStates}
任务队列1:startNum = 0, endNum = 3, currentTime = 当前时间, notStates = 1
任务队列2:startNum = 3, endNum = 32, currentTime = 当前时间, notStates = 1
任务执行
1. 基于ID锁定表中记录 2. 执行 3. 任务队列1执行,当没有任务时,暂停500ms 4. 任务队列2执行,当没有任务时,暂停10s