[英]C# Quartz.net scheduler job as windows service not executing though window service is running
[英]Quartz Job Scheduler in Windows Service
我有这个Windows服务项目,它的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完成运行后,对调度程序的引用超出了范围。 应该在函数外部的某个位置定义SomeScheduler,以免收集垃圾。 例如,这就是Quartz.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指出的那样,简单地重用提供的服务器可能会更容易。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.