2015-08-13 9 views
1

Я использую TopShelf для сборки оконных сервисов и пакета TopShelf.Quartz. Возможно ли завершить работу всего сервиса с помощью метода Execute IJob? Сейчас я могу только удалить работу. Например, если я поймаю конкретное исключение в задании, я хотел бы сделать службу регистрации и выключения.Служба выключения из QuartzJob

Спасибо за любой ответ.

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

Вы называете 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()); 
}); 
+0

Спасибо за ответ, но я хочу отключить весь сервис не только планировщик. Я понятия не имею, как отправлять информацию с кварца на верхнюю часть об этом исключении и услуге крика – Zabaa

+0

@Zabaa посмотреть примеры здесь https://github.com/dtinteractive/Topshelf.Integrations, кажется, последнее ваше дело. также, обновленный ответ – Backs

+1

Это, но заставим вашу службу внедрить ServiceControl и позволить Topshelf вызывать эти методы вместо использования вышеперечисленных делегатов. Затем, когда вы хотите остановить, вызовите HostControl.Stop(). HostControl - это аргумент для метода Start ServiceControl. –