Witajcie, przychodzę do Was z krótkim pytaniem.
Mam REST serwis do którego lecą taski i są od razu wykonywane. Chciałbym je teraz wrzucać w kolejkę i następnie odpalać tylko gdy poprzedni zakończy pracę, z pulą np. na 3 działające jednocześnie taski. Polecacie jakieś gotowe rozwiązania i przykłady jak mógłbym je użyć, czy zaimplementować po prostu ją samemu z użyciem ExecutorService i javowej Queue?
Wbrew modzie na Springa 1), osobiście lubię i szanuję rzeczy z "nowoczesnego JEE" jak sobie pewien wybór (tzn odcięcie się od staroci) nazywam.
Twój post jest bardzo ogólny, aby to sobie umiał w oczach zobrazować, zanim kawa się we mnie rozpuści.
- projekt masz czysto poza-springowy? Czy te RESTy robisz? Nie zasygnalizowałeś jego użycia...
Mieszać bym nie zalecał.
Zrobiłbym to tak jak piszesz ewentualnie innym ThreadPoolem: https://www.baeldung.com/thread-pool-java-and-guava Pytanie czy wybrałeś kolejkę bo zależy Ci na kolejności czy tak ło, rzuciłeś.
.. jak ze springiem ....
Bardziej bym preferował "cięższą" kolejkę komunikatów out of process (chyba Rabbit MQ jest defaultowy dla Springa???) niż z biblioteki standardowej in-ram.
Z powodów moich własnych, nie muszą być Twoimi.
- zawartość kolejki po restarcie (potrzebna ci lub nie)
- znacznie większa ilość parametrów/kontroli, które mogą się przydać.
- podatność na cięcie / uS itd
Możesz zrobić tak jak napisałeś - taski siedzą w bazie i masz N workerów, którzy sobie je rezerwują i wykonują. Da się to skalować na wiele instancji nawet.
TL;DR
U mnie w systemie byly 3 rodzaje kolejek:
- message queue
- work queue
- job queue
To ostatnie z zaleznosciami od innych zadan, mozliwoscia wznowienia i restartu, sledzeniem czasu wykonania, aktualnym stanem.
Kazdy poziom to nadbudowka na poprzedni przy czym job queue w zalozeniu moze byc tak wolne ze oparte o zwykla baze danych ivwrzucac zadania do work queue gdy sa gotowe.
Wg powyzszej listy Work queue to kolejka zadan aktywnych ktore moga byc rozrzucane na iles work nodow.