加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 如何使用Quartz.net 2.0安排任务?

发布时间:2020-12-16 07:19:16 所属栏目:asp.Net 来源:网络整理
导读:我试图在ASP.NET MVC 4应用程序中使用Quartz.net 2.0安排任务,但我无法完成任务执行. 这是代码: public class ScheduleTaskConfig{ public static void StartScheduler() { ISchedulerFactory schedulerFactory = new StdSchedulerFactory(); IScheduler sc
我试图在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容器.

解决方法

要使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容器中注册作业.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读