【问题标题】:Manually triggering a quartz job with arguments that is hosted in a windows service使用 Windows 服务中托管的参数手动触发石英作业
【发布时间】:2017-08-04 11:16:22
【问题描述】:

我创建了一个运行在 Windows 服务中的 Quartz 服务器,该服务具有各种计划作业。

但是,我需要从 Web 应用程序 UI 中的事件手动触发一项工作。

Quartz.NET 作业:

public class IntensiveJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        // Get job parameters here... BUT HOW?!

        // Do some intensive processing here...
    }
}

我需要触发作业的操作:

public class SomeController : Controller
{
    [HttPost]
    public ActionResult Run()
    {
        // Need to be able to trigger the intensive job here... 
        // Ideally with some arguments too... E.g:
        var job = new IntensiveJob();
        job.Execute();

        return RedirectToAction("Index");
    }
}

任何有关实施此方法或替代方法的最佳方法的建议都会很棒。

【问题讨论】:

    标签: c# asp.net-mvc quartz.net


    【解决方案1】:

    最适合您的问题的解决方案是手动创建一个触发器,该触发器现在由调度程序执行。出现的问题是,如果每次创建触发器时都需要在触发器中包含不同的数据以传递给调度程序。当要求一个新的触发器时,由石英创建的触发器工厂总是会产生一个相同的对象。您必须使用必要的详细信息来实例化 Trigger Impl 的实例,并将其传递给调度程序以运行。 Java 中的示例如下所示:

    JobDetailImpl jdi = new JobDetailImpl();
    jdi.setJobClass(SomeClassWithJob);//The class that contains the task to done.
    SimpleTriggerImpl sti = new SimpleTriggerImpl();
    sti.setStartTime(new Date(System.currentTimeMillis()));
    sti.setRepeatInterval(1);
    sti.setRepeatCount(0);
    context.getScheduler().scheduleJob(jdi,sti); //pseudocode here
    

    关键是使用石英进行调度,而不是仅仅将数据插入数据库。此外,每个项目都需要一个名称和组。

    【讨论】:

    • 好的,这是有道理的。但是,由于我的调度程序托管在 Windows 服务中,因此无法将此触发器添加到调度程序。我想唯一的解决方案是移动到 ADO 作业存储并将触发器记录添加到数据库中。
    • 此解决方案的一个要求是您要导入石英库并在同一环境中运行调度程序。在 C#/.NET 中获取调度程序的方式可能与在 Java 中类似。它应该类似于:IJobExecutionContext.Get(Scheduler).ScheduleJob(IJobDetail, ITrigger)
    • 是的,不幸的是,在同一环境中运行调度程序对我来说不是一个选项,它将托管在 Windows 服务中的隔离服务器上。但是,连接数据库驱动的作业/触发器存储将使我能够按照您的建议来创建几乎立即开始的新触发器。我会调查的。感谢您的帮助。
    猜你喜欢
    • 2014-01-26
    • 1970-01-01
    • 2011-01-30
    • 2020-08-28
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多