c# - running quartz job in TriggerComplete event -
my program should run maximum (n) job @ time. if there more job needs run store in temp storage , after completing 1 of running job i'll pick trigger base on how trigger fails start , it's priority, , fire job
at initialization phase, create example 5 job 5 corresponding trigger , add scheduler everything's fine until second job running triggercomplete of trigger listener not firing picking job run, please tell me 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 { { 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"); } }
} }
okay, again, i'm not sure instantiating triggerlistener, might want verify adding triggerlistener scheduler.
http://quartznet.sourceforge.net/tutorial/lesson_7.html
see scheduler instance has method "adding" (or registering) listeners. if don't that, events never fire.
Comments
Post a Comment