Asp.net mvc 如何使用Quartz.net 2.0计划任务?
我试图在ASP.net MVC 4应用程序中使用Quartz.net 2.0计划任务,但无法执行该任务 代码如下:Asp.net mvc 如何使用Quartz.net 2.0计划任务?,asp.net-mvc,quartz.net-2.0,Asp.net Mvc,Quartz.net 2.0,我试图在ASP.net MVC 4应用程序中使用Quartz.net 2.0计划任务,但无法执行该任务 代码如下: public class ScheduleTaskConfig { public static void StartScheduler() { ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler scheduler = schedule
public class ScheduleTaskConfig
{
public static void StartScheduler()
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
JobKey emailSenderTaskKey = new JobKey("emailSenderTask", "email");
IJobDetail emailSenderTask = JobBuilder.Create<QueuedEmailsSendTask>()
.WithIdentity(emailSenderTaskKey)
.Build();
TriggerKey emailSenderTriggerKey = new TriggerKey("emailSenderTrigger", "email");
ITrigger emailSenderTrigger = TriggerBuilder.Create()
.WithIdentity(emailSenderTriggerKey)
.WithSimpleSchedule(s => s.RepeatForever().WithIntervalInSeconds(5))
.StartNow()
.Build();
scheduler.ScheduleJob(emailSenderTask, emailSenderTrigger);
scheduler.Start();
}
}
下面是实现IJob接口的类:
public class QueuedEmailsSendTask : IJob
{
private IQueuedEmailsService _queuedEmailsService { get; set; }
private IEmailSenderService _emailSenderService { get; set; }
public QueuedEmailsSendTask(IQueuedEmailsService queuedEmailsService, IEmailSenderService emailSenderService)
{
this._queuedEmailsService = queuedEmailsService;
this._emailSenderService = emailSenderService;
}
public void Execute(IJobExecutionContext executeContext)
{
//do stuff ...
}
}
我在Execute方法的开头放置了一个断点,但调试器并没有停止在那里。我做错了什么
更新:
它与实现IJob接口的类没有默认构造函数有关。
如果我这样修改构造函数,它会工作:
public QueuedEmailsSendTask()
{
}
但我需要能够注入依赖项。我正在使用Autofac IoC容器。启动调度程序后,您是否尝试调度作业
public class ScheduleTaskConfig
{
public static void StartScheduler()
{
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.Start(); //start here
//construct job info
scheduler.ScheduleJob(emailSenderTask, emailSenderTrigger); //schedule here
}
}
要使Quartz.net与IoC容器一起工作,您需要有一个实现IJobFactory的工厂类:
public class AutofacJobFactory : IJobFactory
{
private readonly IContainer _container;
public AutofacJobFactory(IContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}
}
然后,需要在初始化代码中将JobFactory实例分配给调度程序:
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.JobFactory = new AutofacJobFactory(container);
不要忘记在IoC容器中注册作业。您需要确保
AutofacJobFactory
负责实例化作业。这意味着不使用作业生成器对象。相反,您应该以jobdailimpl
对象的形式传递计划程序的AutofacJobFactory
创建的作业的详细信息。您的工作代码如下所示
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.JobFactory = new AutofacJobFactory(container);
scheduler.Start(); //start here
// construct job info
JobDetailImpl jobDetail = new JobDetailImpl("emailSenderTask", null, typeof(QueuedEmailsSendTask));
TriggerKey emailSenderTriggerKey = new TriggerKey("emailSenderTrigger", "email");
ITrigger emailSenderTrigger = TriggerBuilder.Create()
.WithIdentity(emailSenderTriggerKey)
.WithSimpleSchedule(s => s.RepeatForever().WithIntervalInSeconds(5))
.StartNow()
.Build();
sched.ScheduleJob(jobDetail, trigger);
有关完整示例,请参见以下问题当我调试时,在NewJob方法中,我得到以下异常:“从请求实例的作用域中看不到标记与“AutofacWebRequest”匹配的作用域。这通常表示根据HTTP请求注册的组件正被web集成下的SingleInstance()组件(或类似场景)请求。始终从DependencyResolver.Current或ILifetimeScopeProvider.RequestLifetime请求依赖项,而不是从容器本身。“在ASP.NET中执行重复的后台任务不是一个好主意(详细信息)。
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler = schedulerFactory.GetScheduler();
scheduler.JobFactory = new AutofacJobFactory(container);
scheduler.Start(); //start here
// construct job info
JobDetailImpl jobDetail = new JobDetailImpl("emailSenderTask", null, typeof(QueuedEmailsSendTask));
TriggerKey emailSenderTriggerKey = new TriggerKey("emailSenderTrigger", "email");
ITrigger emailSenderTrigger = TriggerBuilder.Create()
.WithIdentity(emailSenderTriggerKey)
.WithSimpleSchedule(s => s.RepeatForever().WithIntervalInSeconds(5))
.StartNow()
.Build();
sched.ScheduleJob(jobDetail, trigger);