如何使用Quartz停止服务?

时间:2016-01-25 00:44:23

标签: c# service quartz-scheduler msmq quartz.net

我是MSMQ,Quartz和服务的新手。我有一项服务,如果抛出异常,将发送通知电子邮件。我试图找到一种方法来暂停或停止服务一旦发送电子邮件,所以我不会一遍又一遍地收到相同的例外电子邮件。我只需要一次电子邮件。 到目前为止,我已经尝试过:

  1. _scheduler.DeleteJob(jobKey);
  2. _scheduler.UnscheduleJob(triggerKey);
  3. _scheduler.Shutdown();
  4. _scheduler.Interrupt(jobKey);
  5. serviceController.Stop();
  6. serviceController.Pause();
  7. _scheduler.RescheduleJob(key,exceptionTrigger); < - 用一个间隔时间为零的新的触发器超过我的旧触发器
  8. 我的工作和触发器代码按预期工作:

         public void CreateRegistration()
         {
            this._scheduler = StdSchedulerFactory.GetDefaultScheduler();
            CreateJob();
            CreateTrigger();
            RegisterWithScheduler();
         }
    
         public void CreateJob()
         {
           _scheduler.Start();
           this._job = JobBuilder.Create<RecieveMessageJob>()
                        .WithIdentity("ReceiveMessagesJob",      
                                      this._messageGroupName)
           .Build();
         }
    
         public void CreateTrigger()
         {
           _trigger = TriggerBuilder.Create()
              .WithIdentity(this._triggerName, this._messageGroupName)
              .StartNow()
              .WithSimpleSchedule(x => x
                    .WithIntervalInMinutes(1)
                    .RepeatForever())
            .Build();
          }
    
          public void RegisterWithScheduler()
          {
                _scheduler.ScheduleJob(_job, _trigger);
          }
    

    在我的ReceiveMessageJob作业类中,我在执行方法(Execute(IJobExecutionContext context))中查找异常错误,并在需要时调用PauseService()。在这里,您可以看到我停止或暂停服务的各种尝试。

    public void PauseService()
    {   
      TriggerKey triggerKey = this._trigger.Key;
      JobKey jobKey = this._job.Key;
    
            // Define a new Trigger 
            //ITrigger exceptionTrigger = TriggerBuilder.Create()
            //      .WithIdentity("exceptionTrigger", this._messageGroupName)
            //      .StartNow()
            //      .WithSimpleSchedule(x => x
            //          .WithIntervalInMinutes(0))
            //      .Build();
    
            // tell the scheduler to remove the old trigger with the given key, and put the new one in its place
            //_scheduler.RescheduleJob(key, exceptionTrigger);
    
            //_scheduler.DeleteJob(jobKey);
    
            //_scheduler.UnscheduleJob(triggerKey);
    
            //_scheduler.Shutdown();
    
            //_scheduler.Interrupt(jobKey);
    
            //ServiceController serviceController = new ServiceController("MessagingService");
            //serviceController.Stop();
            //serviceController.Pause();
        }
    

    我无法弄清楚为什么我的尝试都没有奏效。有没有人在我的代码中看到错误或知道不同的方式?提前致谢!

1 个答案:

答案 0 :(得分:0)

我不确定我是否了解调度程序如何与服务绑定。你的意思是Windows NT服务?调度程序是否运行启动服务的作业?无论哪种方式,当服务中出现错误时,只需将服务自行关闭即可。调度程序与此无关。