需求:定时器可以进行实时开关、运行时间的调整操作,且需要部署在分布式环境下。
解决方案:
1、配置灵活性:
使用servlet对目前所有的定时器进行初始化,与时间配置一起保存在servlet的static字段中。
这样就可以根据用户的配置,对内存中的定时器及其时间配置进行灵活操作。
2、分布式环境下的数据一致性问题:
① 创建分布式排他锁,对同一时间段内的多个节点的请求进行互斥。
② 每个定时器任务执行之前都需要同步数据库时间配置,一旦发现配置变动,即进行相应的配置变动,保持与数据库的配置同步。
③ 任务执行完毕之后,timer休眠10分钟,防止节点之间时钟差异,相同任务重复执行的问题。
④ servlet的destroy方法中清除所有定时器。
关键代码:
// 创建每天特定时间执行的定时器:
Timer timer = new Timer();
Date taskDate = getDate("12");
timer.schedule(new XXXTask(), taskDate, 24*60*60*1000); // 每天特定时间执行任务
// 获取特定时间的Date类
public Date getDate(String executeTime) {
int hour = Integer.parseInt();
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY);
calendar.set(year, month, day, hour, 00, 00);
Date taskDate = calendar.getTime();
if (taskDate.before(new Date)) {
// 将时间设置为明天
calendar.add(Calendar.DATE, 1);
taskDate = calendar.getTime();
}
return taskDate;
}