Я не совсем уверен, является ли это скорее проблемой Openbravo или проблемой Quartz, но у нас есть некоторые ручные процессы, которые выполняются по расписанию через объекты Openbravo ProcessRequest
(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);
}
. Это работало нормально, когда я тестировал, запрашивая запуск процесса сразу дважды в одно и то же время. Один из них отменен. Однако он не работает с запланированными процессами. У меня есть S.o.p, настроенный для регистрации при запуске процессов, и просмотр журналов показывает каждую строку вывода дважды, каждую строку одну за другой.
У меня есть подозрение, что это потому, что процессы либо работают в двух совершенно разных потоках, которые не знают о процессах друг друга, однако я не уверен, как проверить свои подозрения или, если я прав, что делать. сделать об этом. Я уже убедился, что в базе данных хранится только один экземпляр каждого из ProcessRequest
объектов.
Кто-нибудь еще сталкивался с этим, знает, почему они могут запускаться дважды, или знает, что я могу сделать, чтобы они не запускались одновременно?