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

本文介绍了一种在使用Quartz进行定期任务调度时遇到的数据重复处理问题及其解决办法。通过在数据库中创建锁表并利用Hibernate的锁定机制来确保任务在多台服务器上的唯一性执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值