2010-11-05 7 views
7

Widziałem w this tutorial section dokumentacji Quartz.NET, że powinno być możliwe określenie maksymalnej liczby wątków, które planista kwarcowy będzie używał. W moim specjalnym przypadku chcę ustawić ten numer na 1. Ale w dokumencie API nie mogłem znaleźć sposobu na dostęp do instancji threadpool, której mój harmonogram używa i do ustawienia jakichkolwiek właściwości na nim.Jak ustawić liczbę wątków w wątku Quartz.NET?

Obecnie mój kod wygląda następująco:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 

IScheduler scheduler = schedFact.GetScheduler(); 
scheduler.Start(); 

// Setup jobs and triggers and then call scheduler.ScheduleJob... 

Czy ktoś wie jak mogę ustawić liczbę wątków w puli?

Dzięki za pomoc z góry!

Odpowiedz

2

Zależy trochę od używanej puli i pliku konfiguracyjnego, który czyta program planujący. Ale jeśli używasz standardowego SimpleThreadPool.cs wówczas ilość wątków może być skonfigurowany w pliku quartz.config domyślnie 10 wątki tworzone są:

alt text

+2

W międzyczasie znalazłem inne rozwiązanie dla mojego celu: Mam tylko jedną JobDetail z wieloma sparametryzowanymi wyzwalaczami iz ustawieniem ThreadCount na 1 Chciałem się upewnić, że zadania nie działają jednocześnie. (Metoda My Execute nie jest wątkowo bezpieczna.) Jednak bardziej prostym sposobem wydaje się być zaimplementowanie 'IStatefulJob' zamiast IJob, co zrobiłem teraz (wydaje się działać tak, jak chcę). W każdym razie: Zdecydowanie odpowiedziałeś na moje pytanie i dobrze jest wiedzieć na przyszłość, że istnieje plik konfiguracyjny (który do tej pory nie znałem) i co mogę z nim zrobić. Dziękuję Ci! – Slauma

+0

Nie ma za co! Jeśli masz rację, wdrożenie interfejsu IStatefulJob jest najlepszym rozwiązaniem dla twoich wymagań. – jdecuyper

+7

@Slauma: Celem Quartz.Net 2.x jest udekorowanie klasy implementującej 'IJob' za pomocą' [DisallowConcurrentExecutionAttribute] ' –

27

Można to zrobić programowo z poniższy kod Jeśli nie chcą polegać na zewnętrznej quartz.config pliku z jakiegokolwiek powodu:

var properties = new NameValueCollection { {"quartz.threadPool.threadCount", "1"} }; 

    var schedulerFactory = new StdSchedulerFactory(properties); 
    var scheduler = schedulerFactory.GetScheduler(); 

zgadzam się z uwagami w przyjętym odpowiedź jednak, że w tym wypadku prawdopodobnie chcesz użyć [DisallowConcurrentExecutionAttribute] na swojej klasie IJob zamiast.

+0

Zrobiłem to, ale kiedy moja klasa IJob dont have '[DisallowConcurrentExecutionAttribute]' i używam sleep w mojej pracy, jak [ten przykład] (http://pastebin.com/kzyJYqaj) widzisz 'int a' wiele razy przed zakończeniem pierwszego zadania. to dlatego, że kiedy moja nić przechodzi w stan uśpienia, zaczęła wykonywać inną zaplanowaną pracę (** wciąż jest tu tylko jeden wątek **). to było coś, czego początkowo nie rozumiałem i chociaż mogę pomagać innym, więc pozostawiam ten komentarz tutaj: D – Lrrr

1

W pliku web.config dodaj poniżej wartość pod sekcją kwarcu.

<add key="quartz.threadPool.threadCount" value="20" /> 

Wartość reprezentuje liczbę wątków, które są dostępne do równoczesnego wykonywania zadań.