石英作业调度程序在Windows服务
本文关键字:Windows 服务 调度程序 作业 石英 | 更新日期: 2023-09-27 18:12:07
我有一个windows service项目OnStart
方法是这样的
protect void OnStart(string[] args)
{
IScheduler someScheduler = _schedFactory.GetScheduler(); // _schedFactory is a priva field of the service class
IJobDetail someJob = JobBuilder.Create<SomeJob>()
.WithIdentity("SomeJob")
.Build();
ITrigger someTrigger = TriggerBuilder.Create()
.StartAt(new DateTimeOffset(DateTime.UtcNow.AddSeconds(30)))
.WithSimpleSchedule(schedule => scheduler.WithIntervalInMinutes(3).RepeatForever())
.Build();
someScheduler.SchedulerJob(someJob, someTrigger);
someScheduler.Start();
}
我使用Visual Studio Developer命令提示符来安装服务。命令为installutil.exe
。现在,当服务安装,然后我去任务管理器,启动它。在OnStart
方法的顶部有Thread.Sleep(10000)
,因此我可以设法使用调试器连接到服务。当它被连接时,我遍历代码,没有什么特别的事情发生,我的意思是没有异常发生。我甚至可以看到工作应该执行的时间,它是正确的。而我坐在调试模式,等待工作的Execute
方法得到执行,它没有。我的意思是,当时间到来时,visual studio正在加载符号,但工作本身并没有被执行。有什么问题吗?还有一件事,我在这个OnStart
方法中创建了两个工作。代码是一样的。它会是问题的原因吗?第二个任务有时执行,有时不执行。我的意思是,如果它执行一次,它将每3分钟执行一次,但如果它没有在第一个计划时间执行,它将永远不会执行。
代码的问题是,对调度程序的引用在OnStart完成运行后超出了范围。somesscheduler应该在函数之外的某个地方定义,这样它就不会被垃圾收集。作为一个例子,这是如何石英。Net服务器项目(使用Topshelf,但我认为你得到的想法。这是安装服务的主程序。注意,它返回一个对服务器的引用,这样主机就可以保留对它的引用。
public static class Program
{
/// <summary>
/// Main.
/// </summary>
public static void Main()
{
HostFactory.Run(x =>
{
x.RunAsLocalSystem();
x.SetDescription(Configuration.ServiceDescription);
x.SetDisplayName(Configuration.ServiceDisplayName);
x.SetServiceName(Configuration.ServiceName);
x.Service(factory =>
{
QuartzServer server = new QuartzServer();
server.Initialize();
return server;
});
});
}
}
在QuartzServer类中,调度程序是一个实例变量:
public class QuartzServer : ServiceControl, IQuartzServer
{
private readonly ILog logger;
private ISchedulerFactory schedulerFactory;
private IScheduler scheduler; // code snipped....
}
正如@granadaCoder指出的那样,简单地重用所提供的服务器可能更容易。
这里是QuartzServer和Program.cs的链接