最近研究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的開源項目,這樣的錯誤好像說不過去哦。難道這些項目的詳細設計和編碼是不同的人嗎?或許跟開發者用的數據庫有關吧?