QuartzJob的停机服务

时间:2015-08-13 09:37:50

标签: c# windows-services quartz.net topshelf

我使用TopShelf构建Windows服务和TopShelf.Quartz包。 是否可以从IJob的Execute方法关闭整个服务?现在我所能做的就是删除工作。例如,如果我在工作中捕获特定的异常,我想制作日志和关机服务。

感谢您的回答。

public class Program
{
   public static void Main()
   {
     HostFactory.Run(c =>
     {
        // Topshelf.Ninject (Optional) - Initiates Ninject and consumes Modules
        c.UseNinject(new SampleModule());

        c.Service<SampleService>(s =>
        {
            //Topshelf.Ninject (Optional) - Construct service using Ninject
            s.ConstructUsingNinject();

            s.WhenStarted((service, control) => service.Start());
            s.WhenStopped((service, control) => service.Stop());

            // Topshelf.Quartz.Ninject (Optional) - Construct IJob instance with Ninject
            s.UseQuartzNinject(); 

            // Schedule a job to run in the background every 5 seconds.
            // The full Quartz Builder framework is available here.
            s.ScheduleQuartzJob(q =>
                q.WithJob(() =>
                    JobBuilder.Create<SampleJob>().Build())
                .AddTrigger(() =>
                    TriggerBuilder.Create()
                        .WithSimpleSchedule(builder => builder
                            .WithIntervalInSeconds(5)
                            .RepeatForever())
                        .Build())
                );
        });
    });
  }
}

public class SampleJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //Here I want catch exception and shoutdown service
    }
}

1 个答案:

答案 0 :(得分:1)

您命名为context,您可以获取调度程序并将其关闭

public class SampleJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        context.Scheduler.Shutdown();
    }
}

documentation页面上有停止整个服务的示例(如果我没有记错的话):

c.Service<SampleService>(s =>
{
    //Specifies that Topshelf should delegate to Ninject for construction
    s.ConstructUsingNinject();

    s.WhenStarted((service, control) => service.Start());
    s.WhenStopped((service, control) => service.Stop());
});