2010-11-05 6 views
7

Ho visto in this tutorial section della documentazione di Quartz.NET che dovrebbe essere possibile definire il numero massimo di thread che lo scheduler Quartz utilizzerà. Nel mio caso speciale voglio impostare questo numero su 1. Ma nel documento API non sono riuscito a trovare un modo per accedere all'istanza del threadpool che il mio scheduler sta usando e per impostare qualsiasi proprietà su di esso.Come posso impostare il numero di thread nel threadpool Quartz.NET?

Attualmente il mio codice simile a questo:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 

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

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

C'è qualcuno che sa come posso impostare il numero di thread nel pool?

Grazie per l'aiuto in anticipo!

risposta

2

Dipende un po 'dal pool che si sta utilizzando e dal file di configurazione che sta leggendo lo scheduler. Ma se si utilizza lo standard SimpleThreadPool.cs allora la quantità di fili può essere configurato all'interno del file quartz.config, per impostazione predefinita vengono creati 10 thread:

alt text

+2

Nel frattempo ho trovato un'altra soluzione per il mio scopo: ho un solo JobDetail con molti trigger parametrizzati e con l'impostazione di ThreadCount su 1 volevo assicurarmi che i lavori non venissero eseguiti contemporaneamente. (Il mio metodo Execute non è thread-safe.) Ma il modo più diretto per questo sembra essere quello di implementare 'IStatefulJob' invece di IJob quello che ho fatto ora (sembra funzionare come voglio). Ad ogni modo: hai sicuramente risposto alla mia domanda ed è bello sapere per il futuro che esiste un file di configurazione (che non conoscevo fino ad ora) e cosa posso fare con esso. Grazie! – Slauma

+0

Prego! Bit che hai ragione, l'implementazione dell'interfaccia IStatefulJob è la soluzione migliore per le tue esigenze. – jdecuyper

+7

@Slauma: il metodo Quartz.Net 2.x è quello di decorare la classe implementando 'IJob' con' [DisallowConcurrentExecutionAttribute] ' –

27

Si può fare questo a livello di codice con il codice qui sotto, se si non vogliono fare affidamento sul quartz.config file esterno per qualsiasi motivo:

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

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

sono d'accordo con i commenti nel risposta accettata però che in questo caso probabilmente si desidera utilizzare [DisallowConcurrentExecutionAttribute] sulla tua classe IJob invece.

+0

Ho fatto questo, ma quando la mia classe IJob non ho '[DisallowConcurrentExecutionAttribute]' e uso un sleep nel mio lavoro, come [questo esempio] (http://pastebin.com/kzyJYqaj) vedi 'int a' più volte prima che il primo lavoro finisca. questo perché quando il mio thread va a dormire ha iniziato a fare un altro lavoro programmato (** ancora c'è solo un thread qui **). questa era una cosa che inizialmente non capivo e che potrebbe aiutare gli altri, quindi lascio questo commento qui: D – Lrrr

1

Nel file web.config aggiungere il valore sotto alla sezione quarzo.

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

Il valore rappresenta il numero di thread disponibili per l'esecuzione simultanea di lavori.