BineG
BineG

Reputation: 365

How to prevent Quartz.Net misfired job from retrying

I know I can specify .WithMisfireHandlingInstructionDoNothing() when building the trigger but some of my jobs are triggered via the IScheduler.TriggerJob() method, so without any triggers.

I can detect and log misfires in the ITriggerListener listener but how can I stop Quartz from trying to fire the job again? If I understand correctly .VetoJobExecution is not usable since the job has to be triggered successfully anyway.

Any other ideas?

Edit: my implementation

        JobDataMap jobData = new JobDataMap(data);
        IJobDetail jobTemplate = await jobScheduler.GetJobDetail(jobKey);


        var jobTrigger = TriggerBuilder.Create()
            .ForJob(jobTemplate)
            .UsingJobData(jobData)
            .WithSimpleSchedule(s => s.WithRepeatCount(0).WithMisfireHandlingInstructionNextWithRemainingCount())
            .StartNow()
            .Build();

        await jobScheduler.ScheduleJob(jobTrigger);

Upvotes: 0

Views: 891

Answers (2)

ismdiego
ismdiego

Reputation: 1

I think I've got it.

You have to use the WithMisfireHandlingInstructionNextWithRemainingCount policy, and WithRepeatCount(0).

But the trick here is to set the right value in the IScheduler MisfireThreshold to the misfire to be considered as a real misfire. I mean, if your misfire threshold is set to 60 seconds (default) then any job not executed in less than 60 seconds from schedule, will NOT be considered as a misfire. And so, the misfire policy will not be used.

In my case, with 3 second duration jobs, I had to set the WithMisfireThreshold to 1 second or less.

This way, the job is not retried if "really misfired".

Upvotes: 0

Marko Lahma
Marko Lahma

Reputation: 6884

Well if you just want the TriggerJob behavior you can achieve that just by adding one simple trigger to scheduler that is going to trigger immediately and configure retry policy for that. So if you can change the call sites of TriggerJob to create a simple trigger instead (maybe an extension method that allows to define the policy), the Quartz source for TriggerJob is here.

Upvotes: 1

Related Questions