Oto mój przypadek użycia.Używanie Spring @Scheduled i @Sync razem
Istniejący system aktualizuje tabelę kolejek baz danych QUEUE.
Chcę zaplanowane powracającym zadanie, które - sprawdza zawartość kolejki - jeśli istnieją wiersze w tabeli to blokuje wiersz i robi trochę pracy - usuwa wiersz w KOLEJCE
jeśli poprzednia praca nadal działa, a następnie zostanie utworzony nowy wątek do wykonania pracy. Chcę skonfigurować maksymalną liczbę współbieżnych wątków.
Używam Spring 3 i mój obecny rozwiązaniem jest wykonanie następujących czynności (za pomocą fixedRate z 1 milisekundę, aby uzyskać nici uruchomić w zasadzie w sposób ciągły)
@Scheduled(fixedRate = 1)
@Async
public void doSchedule() throws InterruptedException {
log.debug("Start schedule");
publishWorker.start();
log.debug("End schedule");
}
<task:executor id="workerExecutor" pool-size="4" />
Ta utworzona 4 wątki prosto i nici poprawnie udostępnił obciążenie pracą z kolejki. Jednak wydaje mi się, że dostaję wycieku pamięci, gdy wątkom zajmuje dużo czasu.
java.util.concurrent.ThreadPoolExecutor @ 0xe097b8f0 | 80 | 373,410,496 | 89.74%
|- java.util.concurrent.LinkedBlockingQueue @ 0xe097b940 | 48 | 373,410,136 | 89.74%
| |- java.util.concurrent.LinkedBlockingQueue$Node @ 0xe25c9d68
Więc
1: Czy mogę używać @Async i @Scheduled razem?
2: Jeśli nie, to w jaki inny sposób mogę użyć sprężyny, aby spełnić moje wymagania?
3: Jak mogę utworzyć nowe wątki tylko wtedy, gdy inne wątki są zajęte?
Dzięki!
EDIT: Myślę, że kolejka pracy był już nieskończenie długo ... Teraz za pomocą
<task:executor id="workerExecutor"
pool-size="1-4"
queue-capacity="10" rejection-policy="DISCARD" />
przygotuje sprawozdanie z wyników
Czy nie działać prawidłowo bez '@ Async'? Metoda opisana za pomocą '@ Scheduled' powinna być mimo to wykonana asynchronicznie. – ach
Jeśli chcesz, aby wątki działały nieprzerwanie, nie powinieneś naprawdę używać funkcji @Scheduled. Jego użycie byłoby dla "zaplanowanych" działań, a nie ciągłych ... – JoeG
możesz rozważyć utworzenie publishWorker.start(); metoda Async. –