最近研究Roller的任务调度设计,自己也照猫和老虎写了个任务实现类,总发现我的任务总有问题:
如果设置为30分钟跑一次,总是不按照规则来。
跟踪了代码发现Roller登记租期的时候没有提交事务,导致释放租期的时候异常了,所以相关的锁信息没有更新,总是在初始化状态。
后来加的事务提交的代码发现锁信息被更新了。于是对比了一下Roller5的代码,发现Roller5是有提交事务的(下面是Roller5的代码strategy.flush();
):
Query q = strategy.getNamedUpdate(
"TaskLock.updateClient&Timeacquired&Timeleased&LastRunByName&Timeacquired");
q.setParameter(1, task.getClientId());
q.setParameter(2, Integer.valueOf(task.getLeaseTime()));
q.setParameter(3, new Timestamp(runTime.getTime()));
q.setParameter(4, task.getName());
q.setParameter(5, taskLock.getTimeAquired());
q.setParameter(6, new Timestamp(leaseExpiration.getTime()));
int result = q.executeUpdate();
if(result == 1) {
strategy.flush();
return true;
}
Query q = strategy.getNamedUpdate(
"TaskLock.updateTimeLeasedByName&Client");
q.setParameter(1, Integer.valueOf(0));
q.setParameter(2, task.getName());
q.setParameter(3, task.getClientId());
int result = q.executeUpdate();
if(result == 1) {
strategy.flush();
return true;
}
可能还有很多问题没有发现,以后再说!
其实想来这个是一个比较低级的错误,为什么作为apache的开源项目,这样的错误好像说不过去哦。难道这些项目的详细设计和编码是不同的人吗?或许跟开发者用的数据库有关吧?