Запланированные процессы, запущенные дважды одновременно в Openbravo (с использованием Quartz)

Я не совсем уверен, является ли это скорее проблемой 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объектов.

Кто-нибудь еще сталкивался с этим, знает, почему они могут запускаться дважды, или знает, что я могу сделать, чтобы они не запускались одновременно?

8
задан Anthony Atkinson 14 August 2012 в 17:32
поделиться