Sto costruendo un servizio Windows che sta eseguendo un'operazione pianificata che elabora una coda di comandi (da un sistema legacy) a intervalli regolari (una volta al minuto) usando Quartz.netConsentire a Quartz.net di ignorare i fallimenti
Se l'operazione richiede più di 1 minuto, il che sarebbe inusuale ma possibile in determinate circostanze, mi piacerebbe che ignorasse semplicemente i trigger che non avevano sparato.
Tuttavia, non riesco a farlo accadere. Esegue l'elaborazione e quindi attiva rapidamente tutti i trigger che ha perso in rapida successione. Come ho capito, puoi impostare una soglia per i fallimenti, ma non mi sembra di essere in grado di farlo funzionare.
Sto utilizzando [DisallowConcurrentExecution()] sul processo per garantire che sia in esecuzione una sola istanza del processo in qualsiasi momento.
Di seguito sono riportati alcuni frammenti. Prima passaggio in alcune informazioni di configurazione: è così che si imposta la soglia di mancato spegnimento?
NameValueCollection config = new NameValueCollection();
config.Add("quartz.jobStore.misfireThreshold", "600000");
schedFact = new StdSchedulerFactory(config);
Costruire un grilletto con quello che presumo di essere l'impostazione corretta di ignorare fa cilecca:
var trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule( x => x.WithMisfireHandlingInstructionIgnoreMisfires()
.WithIntervalInSeconds(60)
.RepeatForever())
.Build();
Pensieri molto apprezzato.
Codice per il lavoro: Basta giocare con idee approssimative a questo punto, quindi è sufficiente eseguire un'app per console e ritardare in modo casuale un lavoro in modo che scatti sopra l'intervallo impostato su 10 secondi. Tutti i backup incendiati si accendono in rapida successione dopo un paio di ritardi.
[DisallowConcurrentExecution()]
public class SomeJob : IJob
{
public SomeJob() { }
public void Execute(IJobExecutionContext context)
{
Random rnd = new Random(DateTime.UtcNow.Second);
int delay = rnd.Next(2);
Console.WriteLine("Executing Job with delay of "+ delay + " at " + DateTime.UtcNow.ToString());
if (delay == 1)
{
System.Threading.Thread.Sleep(1000 * 25); // sleep for 25 seconds
}
}
}
Example console output:
Executing Job with delay of 1 at 21/05/2015 21:27:17
Executing Job with delay of 1 at 21/05/2015 21:27:42
Executing Job with delay of 0 at 21/05/2015 21:28:07 <-- stacked misfires
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:07 <--
Executing Job with delay of 0 at 21/05/2015 21:28:16
Executing Job with delay of 0 at 21/05/2015 21:28:26
Executing Job with delay of 1 at 21/05/2015 21:28:36
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 0 at 21/05/2015 21:29:01
Executing Job with delay of 1 at 21/05/2015 21:29:06
Potresti incollare il codice per il tuo lavoro? – LeftyX
Grazie per la ricerca: ho aggiornato il post originale con il codice del lavoro. –
Domanda stupida: come può sparare il tuo lavoro ogni 30 secondi quando il tuo grilletto viene attivato ogni minuto? – LeftyX