To powinno być naprawdę łatwe. Używam Quartz działającego pod Apache Tomcat 6.0.18 i mam jobs.xml file, który ustawia moją zaplanowaną pracę, która działa co minutę.Kwarc: zapobieganie równoczesnym przypadkom pracy w jobs.xml
To, co chciałbym zrobić, to czy praca jest nadal uruchomiona, gdy pojawia się następny czas wyzwalania, nie chcę rozpoczynać nowego zadania, więc mogę pozwolić na ukończenie starej instancji.
Czy istnieje sposób, aby to określić w pliku jobs.xml (zapobiec jednoczesnym wystąpieniom)?
Jeśli nie, czy jest sposób, w jaki mogę udostępnić dostęp do pojedynczej pamięci w ramach implementacji mojego wniosku Job? (Czy to przez JobExecutionContext?), Więc sam mogę obsługiwać współbieżność? (I wykryć, czy poprzednia instancja jest uruchomiona)
zmiana: Po brnąc wokół w docs, oto kilka podejść Zastanawiam, ale albo nie wiem, jak je zdobyć do pracy, lub są problemy.
Użyj StatefulJob. Zapobiega to równoczesnemu dostępowi ... ale nie jestem pewien, jakie inne skutki uboczne wystąpią, jeśli go użyję, również chcę uniknąć następującej sytuacji:
Przypuśćmy, że czasy wyzwolenia byłyby co minutę, tj. Wyzwalacz # 0 = w czasie 0, wyzwalacz # 1 = 60000msec, # 2 = 120000, # 3 = 180000 itd., a wyzwalacz # 0 w czasie 0 uruchamia moje zadanie, które zajmuje 130000msec. Z prostym zadaniem, to wykona wyzwalacze # 1 i # 2, podczas gdy wyzwalacz zadania # 0 nadal działa. W przypadku funkcji StatefulJob wykona to wyzwalacze nr 1 i nr 2 w kolejności, zaraz po tym, jak numer 0 zakończy się na 130000. Nie chcę tego, chcę, aby pierwsze i drugie nie działały, a następny wyzwalacz, który uruchamia zadanie, powinien odbywa się na nr 3 (180000msec). Tak więc nadal muszę zrobić coś innego z StatefulJob, aby działał tak, jak chcę, więc nie widzę dużej korzyści z jego używania.
Użyj TriggerListener, aby zwrócić wartość true z vetoJobExecution().
Chociaż implementacja interfejsu wydaje się prosta, muszę wymyślić, jak zadeklarować jedną instancję TriggerListener. Can't find the docs for the xml file.
Użyj udostępnionego obiektu bezpiecznego wątku
static
(na przykład semafora lub coś podobnego) należącego do mojej klasy, która implementuje zadanie.Nie podoba mi się pomysł używania singletonów za pomocą słowa kluczowego
static
pod Tomcat/Quartz, nie jestem pewien, czy są jakieś efekty uboczne. Poza tym naprawdę nie chcę, aby były prawdziwymi singletonami, tylko czymś, co wiąże się z określoną definicją stanowiska.Implementuję mój własny Trigger, który rozszerza SimpleTrigger i zawiera stan współdzielony, który może uruchomić własny TriggerListener.
Ponownie, nie wiem, jak skonfigurować plik XML, aby użyć tego wyzwalacza zamiast standardowego
<trigger><simple>...</simple></trigger>
.
W nowszych wersjach kwarcu, znakowanie klasy zadania wykonawcze w @DisallowConcurrentExecution zapewnia, że tylko jedna klasa biegnie w każdej chwili ... – sbrattla