我不太确定这更多的是 Openbravo 问题还是 Quartz 问题,但我们有一些手动进程通过 OpenbravoProcessRequest
对象(OB v2.50MP24)按计划运行,但似乎这些进程运行了两次,同时。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);
}
当我通过请求该进程同时立即运行两次来进行测试时,这工作得很好。其中之一取消了。但是,它不适用于预定的流程。我将 Sop 设置为在进程启动时记录日志,查看日志会显示输出的每一行两次,每一行一个接一个。
我有一个偷偷摸摸的怀疑,这是因为这些进程要么在两个完全不同的线程中运行,它们不知道彼此的进程,但是,我不知道如何验证我的怀疑,或者,如果我是正确的,应该怎么做去做吧。我已经验证ProcessRequest
了数据库中存储的每个对象只有一个实例。
有没有其他人经历过这种情况,知道为什么他们可能会运行两次,或者知道我可以做些什么来防止他们同时运行?