これがOpenbravoの問題なのか、Quartzの問題なのかはよくわかりませんが、OpenbravoProcessRequest
オブジェクト(OB v2.50MP24)を介してスケジュールに従って実行される手動プロセスがいくつかありますが、プロセスは2回実行されているようです。 、まったく同時に。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);
}
これは、プロセスをすぐに2回同時に実行するように要求してテストしたときに、正常に機能しました。それらの1つはキャンセルされました。ただし、スケジュールされたプロセスでは機能していません。プロセスの開始時にログに記録するようにSopを設定しました。ログを見ると、出力の各行が2回、各行が次々に表示されます。
プロセスがお互いのプロセスを知らない2つの完全に異なるスレッドで実行されているためだとこっそり疑っていますが、疑惑を確認する方法や、正しい場合はどうすればよいかわかりません。それについてしなさい。ProcessRequest
データベースに格納されている各オブジェクトのインスタンスが1つしかないことをすでに確認しました。
他の誰かがこれを経験したことがありますか、なぜ彼らが2回実行されているのか、またはそれらが同時に実行されないようにするために私ができることを知っていますか?