最近研究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的开源项目,这样的错误好像说不过去哦。难道这些项目的详细设计和编码是不同的人吗?或许跟开发者用的数据库有关吧?