我正在尝试使用ASP.NET MVC 4应用程序中的Quartz.net 2.0安排任务,但我无法完成任务的执行。
以下是代码:
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();
}
}
在global.asax应用程序启动中调用它
protected void Application_Start()
{
ScheduleTaskConfig.StartScheduler();
...
}
这是实现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容器。
答案 0 :(得分:7)
要使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容器中注册作业。
答案 1 :(得分:1)
您是否在启动调度程序后尝试安排作业?
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
}
}
答案 2 :(得分:0)
您需要确保AutofacJobFactory
负责实例化作业。这意味着不使用JobBuilder
对象。相反,您应该以{{1}}对象的形式传递调度程序AutofacJobFactory
创建的作业的详细信息。您的工作代码如下所示。
JobDetailImpl
有关完整示例,请参阅以下问题How do I create a Quartz.NET’s job requiring injection with autofac