2013-06-10 3 views
2

Я пытаюсь запустить сервер Quartz.net для выполнения моих задач по работе с сайтом. Я создаю задания и триггеры в моем приложении WCF (размещенном на IIS). Таким образом, они могут храниться в базе данных (SQL Server).Quartz.net JobStoreTX Job Save issue

Теперь я не могу понять ADO.NET Job Store. Вот моя web.config часть для Quartz.net:

<configSections> 
    <section name="quartz" type="System.Configuration.NameValueSectionHandler" /> 
</configSections> 
<quartz> 
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" /> 
     <add key="quartz.threadPool.threadCount" value="10" /> 
     <add key="quartz.threadPool.threadPriority" value="Normal" /> 
     <add key="quartz.jobStore.misfireThreshold" value="60000" /> 
     <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
     <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.**SqlServerDelegate**, Quartz" /> 
     <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
     <add key="quartz.jobStore.dataSource" value="ConnectionString" /> 
     <add key="quartz.dataSource.ConnectionString.connectionString" value="Server=*;Database=*;Uid=*;Pwd=*" /> 
     <add key="quartz.dataSource.ConnectionString.provider" value="SqlServer-20" /> 
     <add key="quartz.scheduler.instanceName" value="PaymentService" /> 

     <add key="quartz.jobStore.useProperties" value="true" /> 
</quartz> 

А вот мой global.asax:

public class Global : System.Web.HttpApplication 
    { 
     public static ISchedulerFactory Factory; 
     public static IScheduler Scheduler; 

     protected void Application_Start(Object sender, EventArgs e) 
     { 
      Factory = new StdSchedulerFactory(); 
      Scheduler = Factory.GetScheduler(); 

      JobKey JobKey = new JobKey("GetOrderInfoJob", "Project"); 
      if (Scheduler.CheckExists(JobKey)) 
       Scheduler.DeleteJob(JobKey); 

      IJobDetail job = JobBuilder.Create<PaymentServiceLogic>() 
       .WithIdentity(JobKey) 
       .StoreDurably() 
       .RequestRecovery() 
       .Build(); 

      TriggerKey triggerKey = new TriggerKey("GetOrderInfoTrigger", "Project"); 

      TriggerBuilder tb = TriggerBuilder.Create(); 
      tb.WithIdentity(triggerKey); 
      tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1)); 
      tb.StartNow(); 
      tb.ForJob(job); 
      ITrigger trigger = tb.Build(); 
      Scheduler.ScheduleJob(trigger); 

      Scheduler.Start(); 
     } 
} 

После того, как я уже начал службу WCF на локальном хосте, QRTZ_JOB_DETAILS таблицы в SQL Server для заданий было 1 запись, но триггеров не было. Я проверил этот код пару раз, и теперь никаких заданий не хранятся, и поэтому у меня есть это исключение: Не удалось сохранить задание триггера: задание, на которое ссылается триггер, не существует.

Есть ли ошибка в работе или в здании AdoJobStore?

И второй вопрос о том, как правильно выполнить shutdown в global.asax. Теперь я решил этот метод:

protected void Application_End(object sender, EventArgs e) 
     { 
      ICollection<IScheduler> all = Factory.AllSchedulers; 
      foreach (IScheduler item in all) 
      { 
       item.Shutdown(true); 
      } 
     } 

и реализация моего собственного входа в Application_Error.

ответ

2

Обратите внимание, уверен ли это хорошая идея, чтобы задать два вопроса в одном, но ответ на ваш первый вопрос, вы должны изменить

Scheduler.ScheduleJob(trigger); 

в

Scheduler.ScheduleJob(job, trigger); 

Прежний когда задание ранее было добавлено в планировщик, в то время как последнее одновременно добавляет задание и триггер.

Смежные вопросы