`
老竹枝
  • 浏览: 79071 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

取巧的方法实现多个Quartz同步

 
阅读更多

  一套老系统,采用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);
	}

 看起来有效果,达到预期效果,但总觉得不太正统,下次找个比较正统的解决方案替换之。

0
2
分享到:
评论
2 楼 cloud19841207 2015-11-19  
这样做存在一个问题, 就是1个任务会执行多遍, lock只能保证同一时间执行一个任务。 但不能终止另外一台机器上执行的同一任务。
1 楼 LinApex 2014-11-18  
能解决问题就是好的解决方案!

相关推荐

Global site tag (gtag.js) - Google Analytics