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

新的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<QuartZServiceRunner>(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<QuartZServiceRunner>(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参数
网友评论