2012-04-20 12 views
7

mam zadanie zaplanowane jako takie:Jak rozmiar basenu faktycznie działa z zaplanowanymi zadaniami Spring?

<task:scheduler id="notification.scheduler" pool-size="15" /> 

<task:scheduled-tasks scheduler="notification.scheduler"> 
    <task:scheduled ref="notificationProcessor" method="sendNextQueueEvent" fixed-rate="500" /> 
    <task:scheduled ref="notificationProcessor" method="deleteNextCompletedEvent" fixed-rate="60000" /> 
</task:scheduled-tasks> 

Chyba mam nieporozumienie, w jaki sposób zaplanowane zadania pracy z wielkości basenu. Pomimo tego, że rozmiar basenu wynosi 15, wydaje się, że używany jest tylko jeden wątek. Na przykład, jeśli mam piętnaście zdarzeń w kolejce, myślę, że będzie piętnaście wątków sprawdzających co minutę, aby usunąć zdarzenie z kolejki. Oczywiście, to jest złe.

Jak mogę to zrobić, aby piętnaście wątków wywoływał tę metodę dla przedziału czasu z wykorzystaniem abstrakcji programu Spring Spring?

Edycja: Chcę osiągnąć to: co pół sekundy, chcę sprawdzić, czy istnieją oczekujące w kolejce zdarzenia do wysłania. Kiedy to nastąpi, chcę wysłać maksymalnie 15 (jeśli 15 istnieje). W jaki sposób osiągnąć to przy użyciu abstrakcji wiosny dla rzeczy wątku java?

Odpowiedz

3

sprężyny task:scheduler jest domyślnie właściwości fasoli wrapper dla java.util.concurrent.ThreadPoolExecutor:

corePoolSize - liczba wątków, aby utrzymać się w basenie, nawet jeśli są bezczynne.

to nie gwarantuje, że nieruchomość pools-size jest równoważne posiadające taką liczbę aktywnych wątkach. Z drugiej strony, należy zauważyć, że pod dowolnym punktem w czasiemoże znajdować się tylko maksymalna liczba wątków równa liczbie rdzeni przetwarzających na komputerze, którego używasz; tj. wszystkie inne wątki będą czekać na przejście do trybu RUNNING i kontynuują wykonywanie.

Również w dokumentacji Spring wspomina, że ​​jeśli nie jest to to, czego potrzebujesz, możesz również skorzystać z ConcurrentTaskExecutor.

+0

Jeśli mam cztery rdzenie, czy nie powinny istnieć co najmniej cztery wątki? Widzę tylko jeden. Jeśli mam sto zdarzeń w mojej kolejce, kiedy ten harmonogram się uruchamia, czy nie powinienem natychmiast zobaczyć cztery wywołania sendNextQueueEvent, po jednym z każdego wątku? – AHungerArtist

+0

Cztery to maksymalna liczba aktywnych wątków_, które możesz mieć; to nie jest początkowa konfiguracja domyślna. Widzenie wywołań zależy również od różnych rzeczy, takich jak model współbieżności kolejki, której używasz dla zdarzeń oraz szybkość/okres, w którym wykonywane jest zadanie. Mam nadzieję, że to pomoże. – nobeh

4

Przede wszystkim <task:scheduler/> to opakowanie o numerze ScheduledThreadPoolExecutor przedłużające ThreadPoolExecutor. JavaDoc dla tej ostatniej mówi:

nawet główne wątki są początkowo stworzony i uruchomiony tylko gdy nowe zadania przybyć

drugie musisz zrozumieć, że zaplanowane zadania (jest to cecha Java, nie sprężyny) nie uruchamiać jednocześnie, nawet jeśli zabierają więcej czasu niż interwał powtarzania. Po prostu czekają. Tak więc nie masz 15 zdarzeń czekających w kolejce, masz 15 wykonań, które są opóźnione i czekasz na ten pojedynczy wątek. Nie trzeba tworzyć kolejnego, ponieważ następna operacja musi poczekać na zakończenie poprzedniej. Ponownie, tak działa framework harmonogramu Java.

Oczywiście, jeśli zaplanowano kilka różnych zadań, zostanie utworzonych więcej wątków.

+0

Dziękuję. Myślę, że w większości rozumiem związek między rzeczami.Tak (i ​​prawdopodobnie nie jest to najbardziej eleganckie rozwiązanie), gdybym chciał 15 różnych zdarzeń przetwarzania kolejki wątków, musiałbym powtórzyć " '15 razy? – AHungerArtist

+0

Więc, jak sądzę, jaka jest wartość basenu? Czy jest tak, że jeśli jest pięć zadań, ale rozmiar puli to dwa, pozostałe zadania będą musiały poczekać do zakończenia pierwszych dwóch? – AHungerArtist

+0

@AHungerArtist: nie, faktycznie lepszym rozwiązaniem byłoby posiadanie puli zarządzanej przez Spring z 'pool-size =" 15 "' po prostu dodawanie nowego zadania do zwykłej 'ExecutorService' z 15 wątkami. Następnie przetwarza zdarzenia przy użyciu wszystkich wątków tak szybko, jak to możliwe. Wyjaśnij lepiej swój requestmenets, chcesz uruchomić kod co 500ms w 15 wątkach jednocześnie? Albo dodaj to pytanie, albo otwórz kolejne, abyśmy mogli wymyślić jakieś eleganckie rozwiązanie. Pamiętaj, aby opublikować link do kontynuacji, jeśli taki istnieje. –

Powiązane problemy