Quartz.Net从2.x升级到3.x集成TopShelf使用变化

问题

现在工程项目原来使用的是Quartz.Net 2.x版本,最近手贱升级到了3.x版本,同时把TopShelf也升级到最新版,造成问题一大堆。
版本信息如下图:


image.png

新的3.x版本对原来的进行了拆分,所以新引用了Quartz.Jobs及Quartz.Plugins这2项。

解决问题

1、修改Job

    public class TestJob : IJob
    {
        public Task Execute(IJobExecutionContext context)
        {
            JobKey jobKey = context.JobDetail.Key;
            string msg = String.Format("SimpleJob says: {0} executing at {1}", jobKey, DateTime.Now.ToString("r"));
            Console.Out.WriteLineAsync(msg);
            return Task.FromResult(true);
        }
    }

重点问题是新的IJob实现Execute返回的是Task,老的是void,很多在使用的时候对于这个地方的返回不知道如何处理,看代码增加一行:

return Task.FromResult(true);

2、修改ServiceControl

public class QuartZServiceRunner : ServiceControl
    {
        private readonly IScheduler scheduler;

        public QuartZServiceRunner()
        {
            scheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult();
        }

        public bool Start(HostControl hostControl)
        {
            scheduler.Start();
            return true;
        }

        public bool Stop(HostControl hostControl)
        {
            scheduler.Shutdown(false);
            return true;
        }
    }

划重点

scheduler = StdSchedulerFactory.GetDefaultScheduler().GetAwaiter().GetResult();

此处因为StdSchedulerFactory.GetDefaultScheduler()返回的为Task,所以需要调整为上述代码。

同时注意,实现的Start及Stop方法现在增加了HostControl参数,这对后续调用地方有影响。

3、修改HostFactory

static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));
            HostFactory.Run(x =>
            {
                x.UseLog4Net();

                x.Service(s => {                    
                    s.ConstructUsing(name => new QuartZServiceRunner());
                    s.WhenStarted((tc, hc) => tc.Start(hc));
                    s.WhenStopped((tc, hc) => tc.Stop(hc));
                });

                x.RunAsLocalService();
                x.StartAutomaticallyDelayed();

                x.SetDescription("TestQuartzJob");
                x.SetDisplayName("TestQuartzJob");
                x.SetServiceName("TestQuartzJob");

                x.EnablePauseAndContinue();
            });
        }

划重点

x.Service(s => {
s.ConstructUsing(name => new QuartZServiceRunner());
s.WhenStarted((tc, hc) => tc.Start(hc));
s.WhenStopped((tc, hc) => tc.Stop(hc));
});

此处注意WhenStarted和WhenStopped调用使用有hc参数,对应HostControl

总结

OK,以上就是调用需要注意的3个地方,主要的变化就是

  • Job的Execute变为Task返回值
  • ServiceControl的实现方法增加了HostControl参数

你可能感兴趣的:(Quartz.Net从2.x升级到3.x集成TopShelf使用变化)