C#Quartz.Net Scheduler作业如果有参数化构造函数则不执行

时间:2016-07-08 10:50:05

标签: c#-4.0 quartz.net topshelf

我正在使用C#Quartz.Net创建一个预定作业,并使用TopShelf将其作为Windows服务。

如果类包含参数化构造函数,则不会执行计划作业。我正在使用Unit for Dependency Injection。

任何人都可以帮我解决问题吗?

以下是示例代码:

class Program
{
    static void Main(string[] args)
    {
        ISchedulerFactory factory = new StdSchedulerFactory();

        IScheduler scheduler = factory.GetScheduler();
        scheduler.Start();

        IJobDetail job = JobBuilder.Create<SimpleJob>()
            .WithIdentity("job1", "group1")
            .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .WithSchedule(CronScheduleBuilder.CronSchedule("0/5 * * * * ?"))
            .Build();

        scheduler.ScheduleJob(job, trigger);

    }
}

public class SimpleJob : IJob
{
    public SimpleJob(IRepository repo) { } //If i comment out this line, then it works.
    public void Execute(IJobExecutionContext context)
    {
        Console.WriteLine("Hello, JOb executed");
        Console.ReadLine();
    }
}

由于

3 个答案:

答案 0 :(得分:2)

根据documentation for IJob

  

此接口的实例必须具有公共无参数构造函数

通过定义构造函数,编译器假定您不再需要默认构造函数。

这个特殊构造函数有什么意义? (它不会被Quartz使用。)

如果你需要这个构造函数用于其他目的,那么你还需要显式包含Quartz可以使用的默认构造函数。

答案 1 :(得分:1)

我们能够通过我们自己的JobFactory实现上面提到的这个。我们希望将我们的工作视为使用IOC实现的任何其他类来提供作业所需的依赖关系。

以下是我们的实施:

    public class ContainerJobFactory : PropertySettingJobFactory
    {
        private readonly IContainer container;

        public ContainerJobFactory(IContainer container)
        {
            this.container = container;
        }

        public override IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
        {
            var job = container.GetInstance(bundle.JobDetail.JobType);
            if (ReferenceEquals(job, null))
                return base.NewJob(bundle, scheduler);
            SetObjectProperties(job, bundle.JobDetail.JobDataMap);
            return (IJob) job;
        }
    }

以下是我们插入JobFactory的方式:

 scheduler.JobFactory = new ContainerJobFactory(StaticContainer.Instance);             
 await scheduler.Start();

答案 2 :(得分:0)

简短的回答是Quartz.Net需要一个无参数的构造函数。那是那个。

因为你看起来像是想要INJECT,所以这是我收藏的一篇文章。

http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/

关键信息行是

&#34;您可能想要创建自己的JobFactory实现来完成诸如让应用程序的IoC或DI容器生成/初始化作业实例之类的事情。&#34;