? 一套老系统,采用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); }
?看起来有效果,达到预期效果,但总觉得不太正统,下次找个比较正统的解决方案替换之。
原文:http://naso.iteye.com/blog/2157332