2015-01-09 3 views
0

Я новичок в этой игре Quartz.NET, и у меня есть некоторые вопросы об этом, потому что она не работает так, как я хочу.Quartz.NET scheduling

Вопрос 1: Я определяю простые IJobDetail и ITrigger. [решаемые]

NameValueCollection config = ConfigurationManager.GetSection("quartz") as NameValueCollection; 
 
      ISchedulerFactory schedFact = new StdSchedulerFactory(config); 
 
      IScheduler scheduler = schedFact.GetScheduler(); 
 

 
      try 
 
      {    
 
       scheduler.Start();    
 

 
       IJobDetail job = JobBuilder.Create<HelloJobTestScheduling>() 
 
        .WithIdentity("job1", "group1") 
 
        .Build(); 
 

 
       DateTimeOffset endDate = DateTime.Now.AddMinutes(5); 
 
       
 
       ITrigger trigger = TriggerBuilder.Create() 
 
        .WithIdentity("trigger1", "group1") 
 
        .StartNow() 
 
        .WithSimpleSchedule(x => x 
 
         .WithIntervalInSeconds(10) 
 
         .WithRepeatCount(2)) 
 
        .EndAt(endDate) 
 
        .Build(); 
 
       
 
       scheduler.ScheduleJob(job, trigger);    
 
       
 
      } 
 
      catch(SchedulerException se) 
 
      { 
 
       Console.WriteLine(se); 
 
      } 
 
      finally 
 
      { 
 
       scheduler.Shutdown(); 
 
      }

HelloJobTestScheduling

public void Execute(IJobExecutionContext context) 
 
     { 
 
      JobKey key = context.JobDetail.Key; 
 

 
      JobDataMap dataMap = context.JobDetail.JobDataMap; 
 

 
      string connectionString = @"Data Source=localhost\dejan;Initial Catalog=QuartzTest;Integrated Security=True"; 
 

 
      string query = "INSERT INTO test (id, datetime) " + 
 
        "VALUES (@id, @datetime) "; 
 

 
      // create connection and command 
 
      using (SqlConnection cn = new SqlConnection(connectionString)) 
 
      using (SqlCommand cmd = new SqlCommand(query, cn)) 
 
      { 
 
       // define parameters and their values 
 
       cmd.Parameters.Add("@id", SqlDbType.Int).Value = "1"; 
 
       cmd.Parameters.Add("@datetime", SqlDbType.DateTime).Value = DateTime.Now; 
 

 
       // open connection, execute INSERT, close connection 
 
       cn.Open(); 
 
       cmd.ExecuteNonQuery(); 
 
       cn.Close(); 
 
      } 
 
      
 
     }

App.config

<section name="quartz" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089" /> 
 
    
 
    <quartz> 
 
     <add key="quartz.scheduler.instanceName" value="MyScheduler" /> 
 
     <add key="quartz.scheduler.instanceId" value="AUTO" /> 
 
     <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" /> 
 
     
 
     <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz"/> 
 
     <add key="quartz.threadPool.threadCount" value="30"/> 
 
     
 
     <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" /> 
 
     <add key="quartz.jobStore.dataSource" value="default" /> 
 
     <add key="quartz.dataSource.default.connectionString" value="Data Source=localhost\dejan;Initial Catalog=QuartzTest;Integrated Security=True" /> 
 
     <add key="quartz.jobStore.tablePrefix" value="QRTZ_" /> 
 
     <add key="quartz.jobStore.clustered" value="false" /> 
 
     <!--<add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />--> 
 
     <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz" /> 
 
     <add key="quartz.dataSource.default.provider" value="SqlServer-20" /> 
 
     <add key="quartz.jobStore.useProperties" value="false" /> 
 
    </quartz>

Что эта работа на самом деле делает в действительности это: вставить только одну строку в базе данных, и после этого он не будет ничего делать. Он ждет .endAt и показывает в консоли, что планировщик закрыт. Что не так с моим кодом?

Примечание: У меня есть все необходимые таблицы базы данных для работы планировщика в фоновом режиме.

Вопрос 2: Почему этот CRON не распознается? .WithCronSchedule("0 1 0 ? * ?")

Визуальная ошибка студии говорит: '?' can only be specified for Day-of-Month -OR- Day-of-Week.

ответ

1

Cron выражение в Quartz.Net состоит из 7 sub-expressions:

  1. секунды
  2. минут
  3. Часов
  4. дня-месяц
  5. месяца
  6. День из -Week
  7. год (продается отдельно)

Последний вариант не является обязательным. Ваше недопустимое выражение cron. Если вы хотите запустить, чтобы выполнить что-то каждую минуту право один является: 0 0/1 * 1/1 * ? *

Я бы посоветовал вам использовать этот tool для генерации хрон выражений.
Это проще.

+0

Что меня смущает, так это то, что все эти примеры на сайте Quartz.NET имеют 6 подвыражений, а 7-й отмечен как опция. Почему в качестве примера есть коды с 6 подвыражениями, если это не работает? –

+0

Обновлен мой ответ. Фактически последний параметр является необязательным. Ваше выражение cron недопустимо. – LeftyX

+0

Благодарим за редактирование. У меня не было '*' в дополнительном поле 'Year'. Это была настоящая проблема, подумал я, потому что это необязательно. Мне действительно не нужно помещать какие-либо знаки. –

0

Вопрос 1 решается. Короче говоря, моя ошибка заключалась в том, что я закрываю планировщик слишком рано в finally. Если я прокомментирую эту полосу, все будет хорошо.

Но, я все еще Нужна помощь по Вопросу 2.