Search code examples
c#asp.net-mvcquartz.nethangfire

Create and schedule jobs at runtime in .Net MVC


I want to create a Report Scheduler to send the email with attach report automatically based on timings defined by User.

User can specify the Time and Occurrence of Report, once it is saved scheduler need to run on that specific time/day based on settings defined, also every user is independent to define its own settings.

I had taken reference from below SO answer

How to reschedule Quartz job scheduler in C# dynamically from database?

/// <summary>
/// Create a new trigger based on a existing trigger.
/// </summary>
/// <param name="oldTrigger">the existing trigger</param>
/// <param name="startNow">indicates if the trigger should start immediately after schedule</param>
/// <param name="interval">the interval for the new trigger</param>
/// <returns>Returns the new trigger</returns>
public ITrigger CreateTrigger(ITrigger oldTrigger, bool startNow = false, TimeSpan? interval = null)
{
    var builder = oldTrigger.GetTriggerBuilder();
    if (startNow)
        builder = builder.StartNow();
    if (interval.HasValue)
        builder = builder.WithSimpleSchedule(s => s
            .WithInterval(interval.Value)
            .RepeatForever());

    var newTrigger = builder.Build();
    var simpleTrigger = newTrigger as ISimpleTrigger;
    if(simpleTrigger != null)
    {
        var trigger = oldTrigger as ISimpleTrigger;
        if (trigger != null)
            simpleTrigger.TimesTriggered = trigger.TimesTriggered;
    }

    return newTrigger;
}

How to use it

In this example, the Scheduler is already running.
// get the trigger
var trigger = Scheduler.GetTrigger(new TriggerKey("trigger1", "group1"));

// get your settings and set the interval
var reminderSettings = GetReminderSettings();
var intervalBtwnReminders = 0;
if (reminderSettings?.RemindersGap != null)
{
    intervalBtwnReminders = (int)(reminderSettings.RemindersGap);         
}

// reschedule the job with a new trigger and start it immediately.
// if you don't want that it starts now, pass 'false' for the 'startNow' parameter
Scheduler.RescheduleJob(trigger.Key, CreateTrigger(trigger, true, TimeSpan.FromMinutes(intervalBtwnReminders)));

Questions :

Above code shows for rescheduling the job but i want to create new scheduler every time user saves.

what if two users defined same timing then also Quartz.Net work for both?

is there any better approach available or is there any performance issue with this approach?


Solution

  • Hangfire solved all of my above problems