Nie jestem do końca pewien, czy jest to bardziej kwestia Openbravo, czy raczej problem kwarcowy, ale mamy pewne ręczne procesy, które są uruchamiane w harmonogramach przez obiekty Openbravo ProcessRequest
(OB v2.50MP24), ale wygląda na to, że procesy są uruchamiane dwukrotnie, w tym samym czasie. Openbravo rozszerza platformę kwarcową o ich harmonogram. Starałem się rozwiązać ten problem na własną rękę poprzez zapewnienie, że moje zajęcia procesowe rozszerzyć tę klasę:Zaplanowane procesy uruchomione dwa razy jednocześnie w Openbravo (przy użyciu kwarcu)
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);
}
to działało dobrze, kiedy testowano żądając proces uruchomić natychmiast dwa razy w tym samym czasie. Jeden z nich został anulowany. Jednak nie działa on na zaplanowanych procesach. Mam skonfigurowaną funkcję S.o.p, aby rejestrować po rozpoczęciu procesów, a przeglądanie dzienników pokazuje każdą linię danych wyjściowych dwukrotnie, a każdą linię zaraz po drugiej.
Podejrzewam podejrzenie, że dzieje się tak dlatego, że procesy przebiegają w dwóch zupełnie różnych wątkach, które nie znają się nawzajem na swoich procesach, nie jestem jednak pewien, w jaki sposób zweryfikować swoje podejrzenia lub jeśli jestem poprawne, co z tym zrobić. Już sprawdziłem, że istnieje tylko jedno wystąpienie każdego z obiektów ProcessRequest
przechowywanych w bazie danych.
Czy ktoś inny doświadczył tego, wie, dlaczego może działać dwa razy, lub wie, co mogę zrobić, aby zapobiec ich jednoczesnemu uruchomieniu?
Czy próbowałeś sprawdzić zrzut wątku podczas debugowania (mam na myśli, które wątki są uruchomione)? – kamaci
kamaci, chciałbym spróbować, ale ten sam scenariusz nie dzieje się na mojej maszynie programistycznej; dzieje się to tylko na serwerze produkcyjnym, którego nie wiem jak debugować wątki, ponieważ jest dostęp tylko do wiersza poleceń (więc nie mogę użyć czegoś takiego jak VisualVM). –
Proponuję użyć logowania i zapisania go w pliku dziennika. Może może nam coś pokazać? Z drugiej strony, jeśli jest to inna maszyna, a nie twoja i inni programiści też jej używają, pamiętaj, że nikt nie dociera do tego komputera i nie robi testu podczas testowania. – kamaci