一套老系统,采用Quartz进行一些定期任务。新加定期任务,处理数据库中的某些数据。由于采用了tomcat集群,有多台服务器并且同一台机器上有多个tomcat。
代码简单,但是出来以后发现由于多个任务会同时进行,导致同一条数据被多次处理。毫无疑问,这种情况是无法接受的。首先想到的是通过配置Quartz实现任务同步。但是对Quartz不是很熟悉,Google一轮下来,发现Quartz提供了同步,但是配置似乎相当复杂,并且出来的效果是Quartz集群,同一个时刻只能一个tomcat的Quartz运行,而我应用中有些任务必须每个tomcat必须运行,感觉没达到要求。
第二步,决定自己处理,尝试了几种方法,没达到预期效果。
最后,想到一个感觉有点取巧的办法。不知道会有什么问题,但是暂时解决问题。
做法是定义一张新表,只有一个字段ID,默认插入一条记录。
定义一个函数,每次开始任务时load该行并且锁定。
public void getLock() {
session = this.getSession();
tx = session.beginTransaction();
session.load(TLock4Check.class, 1,LockMode.UPGRADE);
}
任务结束时,放弃锁定
public void releaseLock() {
tx.rollback();
this.releaseSession(session);
}
看起来有效果,达到预期效果,但总觉得不太正统,下次找个比较正统的解决方案替换之。