запуск задания кварца в событии TriggerComplete

моя программа должна выполнять максимум (N) заданий за раз. если нужно выполнить больше заданий, они хранятся во временном хранилище, и после завершения одного из текущих заданий я выберу другой триггер на основе того, насколько триггер не запускается и его приоритет, а затем запускаю его задание

at initialization phase, I create for example 5 job with 5 corresponding trigger and add it to scheduler everything's fine until second job is running but TriggerComplete of the trigger listener is not firing for picking up another job to run, could you please tell me where im wrong ??

public class CrawlerTriggerListener : ITriggerListener
{
   private int maxConcurrentCrawling = 1;
   private int currentCount = 0;
   private object syncLock = new object();
   private Dictionary fireDic = new Dictionary();

public string Name { get { return "listener"; } }

public void TriggerFired(Trigger trigger, JobExecutionContext context) { if (fireDic.Count == 0) { IScheduler sched = context.Scheduler; string[] triggerNameList = sched.GetTriggerNames("triggerGroup"); foreach (string triggerName in triggerNameList) { MissfiredInfo missedInfo = new MissfiredInfo(); missedInfo.TriggerName = triggerName; missedInfo.Priority = sched.GetTrigger(triggerName, "triggerGroup").Priority; fireDic.Add(triggerName, missedInfo); } } } public bool VetoJobExecution(Trigger trigger, JobExecutionContext context) { lock (syncLock) { if (currentCount < maxConcurrentCrawling) { currentCount++; fireDic[trigger.Name].FailCount = 0; fireDic[trigger.Name].LastFireTime = DateTime.UtcNow; return false; } else { fireDic[trigger.Name].LastFireTime = DateTime.UtcNow; fireDic[trigger.Name].FailCount++; return true; } } } public void TriggerMisfired(Trigger trigger) { }

public void TriggerComplete(Trigger trigger, JobExecutionContext context, SchedulerInstruction triggerInstructionCode) { lock (syncLock) { currentCount--;

       var validCandidate = new Dictionary<string, int>();
       foreach (KeyValuePair<string, MissfiredInfo> fireDicItem in fireDic)
           if (fireDicItem.Value.FailCount > 0)
              validCandidate.Add(fireDicItem.Key, fireDicItem.Value.FailCount * 73 + fireDicItem.Value.Priority);

       if (validCandidate.Count > 0)
       {
           var sorted = (from entry in validCandidate orderby entry.Value ascending select entry);
           string triggerName = sorted.First().Key;
           fireDic[triggerName].LastFireTime = DateTime.UtcNow;
           fireDic[triggerName].FailCount = 0;
           string jobName = context.Scheduler.GetTrigger(triggerName, "triggerGroup").JobName;
           currentCount++;

           context.Scheduler.TriggerJob(jobName, "jobGroup");
        }
   }

} }


person Ehsan    schedule 06.02.2011    source источник


Ответы (1)


Итак, еще раз, я не уверен, где вы создаете экземпляр TriggerListener, но вы можете захотеть убедиться, что вы добавляете TriggerListener в планировщик.

http://quartznet.sourceforge.net/tutorial/lesson_7.html

Обратите внимание, что у экземпляра планировщика есть метод «добавления» (или регистрации) слушателей. Если вы этого не сделаете, события никогда не сработают.

person warriorpostman    schedule 11.02.2011