如何从数据库动态地重新调度C#中的Quartz作业调度程序? [英] How to reschedule Quartz job scheduler in C# dynamically from database?

查看:568
本文介绍了如何从数据库动态地重新调度C#中的Quartz作业调度程序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的C#.Net网站中包含了Quartz.net库,以便根据某些条件自动发送电子邮件。我已经开始使用RepeatForever()工作。我正在从数据库获取调度程序的设置。现在,当作业已经开始时,无论如何都要检查数据库中调度程序的设置是否已更改,因此我也应该在我的方法中更新它们,以便调度程序以新设置动态运行?到目前为止,我已经做到了:

I have included Quartz.net library in my C#.Net website to send emails automatically based on some conditions. I have started the job to with RepeatForever(). I am getting the settings for the scheduler from database. Now when the job has already started is there anyway to check if the settings for the scheduler in the database have changed so i should also update them in my method so that scheduler runs with the new settings dynamically? So far I have done this:

public void StartJob()
    {
        var reminderSettings = GetReminderSettings();  //getting these settings from database
        var count = GetUnpaidInvoicesListCount();
        var intervalBtwnReminders = 0;
        if (reminderSettings?.RemindersGap != null)
        {
            intervalBtwnReminders = (int)(reminderSettings.RemindersGap);         
        }

        ISchedulerFactory schedFact = new StdSchedulerFactory();

        IScheduler sched = schedFact.GetScheduler();
        sched.Start();

        // create job
        IJobDetail job = JobBuilder.Create<EmailJob>()
                .WithIdentity("job1", "group1")
                .Build();

        // create trigger
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .WithSimpleSchedule(x =>
            {
                 x.WithIntervalInMinutes(intervalBtwnReminders ).RepeatForever();
            })
            .Build();

        sched.ScheduleJob(job, trigger);
    }


推荐答案

我写了一组方法使它更容易。
您不能使用新间隔来编辑现有触发器,但可以将现有触发器替换为新触发器。
CreateTrigger 方法基于旧的触发器创建一个新的触发器,并传输 TimesTriggered 计数。

I wrote a set of methods to make it more easy. You can't edit an existing trigger with your new interval, but you can replace your existing trigger with a new one. The CreateTrigger method creates a new Trigger based on a old one and transfers the TimesTriggered count.

/// <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;
}

使用方法

在此示例中,调度程序已在运行。

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)));

这篇关于如何从数据库动态地重新调度C#中的Quartz作业调度程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆