Quartz .NET运行多个任务

时间:2018-04-19 07:42:04

标签: asp.net-mvc-4 quartz.net

我在ASP .NET MVC 4 Web应用程序中使用了Quartz .NET,可以启动长时间运行的任务。长时间运行的任务应该在POST后的Controller方法中启动,而不是使用Application_Start。我的代码运行良好,但只有在没有其他任务正在运行时,否则运行任务将停止。如何同时运行多个任务并使用相同的IJob实现的类? Quartz .NET是该用例的正确框架吗?

public async Task<ActionResult> Processfile(HttpPostedFileBase file) {
   var groupName = "Group";
   var jobId = "processJob" + Guid.NewGuid();

   // defines the job
   IJobDetail job = JobBuilder.Create<ProcessJob>()
    .WithIdentity(jobId, groupName)
    .UsingJobData(parameters)
    .Build();

   // defines the trigger
   ITrigger trigger = TriggerBuilder.Create()
     .WithIdentity("processTrigger" + Guid.NewGuid(), groupName)
     .WithPriority(1)
     .StartNow()
     .Build();

  // Tell quartz to schedule the job using our trigger
  await scheduler.ScheduleJob(job, trigger);
  await scheduler.Start();
return new HttpStatusCodeResult(HttpStatusCode.OK, "OK");

}

3 个答案:

答案 0 :(得分:0)

调度程序应该在后台运行。理想情况下,您运行服务器进程并在需要时在其中添加作业。根据您的设置,ASP.NET应用程序中运行的调度程序可能是a bad idea

所以看到你的代码,scheduler.Start()似乎很奇怪。

答案 1 :(得分:0)

你打电话 await scheduler.Start(); 每次。 而是尝试启动定义调度程序的作业。

            IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();
        scheduler.Start();

然后构建作业并触发并调用await scheduler.ScheduleJob(job, trigger); 这样你的问题就应该解决了。

答案 2 :(得分:0)

要运行多个作业,可以声明IJobDetail类的多个实例以及相应的ITrigger对象。

例如

IJobDetail job = JobBuilder.Create<Class1>.Build();
IJobDetail job2 = JobBuilder.Create<Class2>.Build();

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger1", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInMinutes(1)
                    .RepeatForever())
                .Build();

ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("trigger2", "group1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInMinutes(1)
                    .RepeatForever())
                .Build();

然后将两个作业调度到同一调度程序中,

            scheduler.ScheduleJob(job, trigger1);
            scheduler.ScheduleJob(job2, trigger2);

然后启动调度程序

        scheduler.Start(); 

OR 或者,使用字典的方法-另一种方法请参考this article