石英作业调度程序在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分钟执行一次,但如果它没有在第一个计划时间执行,它将永远不会执行。

石英作业调度程序在Windows服务

代码的问题是,对调度程序的引用在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的链接