我不太確定這是更多的Openbravo問題還是更多的Quartz問題,但我們有一些手動進程通過Openbravo ProcessRequest
對象( OB v2.50MP24),但似乎這些進程在同一時間運行兩次。 Openbravo擴展了Quartz平臺的時間安排。我試着通過確保我的工藝類擴展這個類來解決我自己這個問題:計劃進程在Openbravo中同時運行兩次(使用Quartz)
import java.util.List;
import org.openbravo.dal.service.OBDal;
import org.openbravo.model.ad.ui.ProcessRequest;
import org.openbravo.scheduling.ProcessBundle;
import org.openbravo.service.db.DalBaseProcess;
public abstract class RBDDalProcess extends DalBaseProcess {
@Override
protected void doExecute(ProcessBundle bundle) throws Exception {
org.quartz.Scheduler sched = org.openbravo.scheduling.OBScheduler
.getInstance().getScheduler();
int runCount = 0;
synchronized (sched) {
List<org.quartz.JobExecutionContext> currentlyExecutingJobs = (List<org.quartz.JobExecutionContext>) sched
.getCurrentlyExecutingJobs();
for (org.quartz.JobExecutionContext jec : currentlyExecutingJobs) {
ProcessRequest processRequest = OBDal.getInstance().get(
ProcessRequest.class, jec.getJobDetail().getName());
if (processRequest == null)
continue;
String processClass = processRequest.getProcess()
.getJavaClassName();
if (bundle.getProcessClass().getCanonicalName()
.equals(processClass)) {
runCount++;
}
}
}
if (runCount > 1) {
System.out.println("Process "
+ bundle.getProcessClass().getSimpleName()
+ " is already running. Cancelling.");
return;
}
doRun(bundle);
}
protected abstract void doRun(ProcessBundle bundle);
}
這工作得很好,當我測試通過請求的過程中,同時立即運行兩次。其中一人被取消。但是,它不適用於計劃的流程。當進程啓動時,我將S.o.p設置爲日誌記錄,並且查看日誌會顯示輸出的每一行兩次,每行一行接一行。
我有一個偷偷摸摸的懷疑,這是因爲這些進程要麼在兩個完全不同的線程中運行,不知道彼此的進程,但是,我不知道如何驗證我的懷疑,或者如果我是正確的,該怎麼辦。我已經驗證數據庫中存儲的每個ProcessRequest
對象只有一個實例。
有沒有其他人經歷過這一點,知道他們爲什麼可能會跑兩次,或知道我能做些什麼來防止他們同時運行?
您是否嘗試在調試時檢查線程轉儲(我是指哪些線程正在運行)? – kamaci 2012-08-18 21:00:27
kamaci,我會嘗試它,但同樣的情況不會發生在我的開發機器上;它只發生在生產服務器上,由於只存在命令行訪問,所以我不知道如何調試線程(所以我不能使用類似VisualVM的東西)。 – 2012-08-20 13:05:55
我建議你使用日誌記錄並將其寫入日誌文件。也許它可以告訴我們什麼?另一方面,如果它是另一臺機器而不是其他開發人員使用它,請注意沒有人在到達該機器並在測試時進行測試。 – kamaci 2012-08-20 15:08:30