2012-03-08 11 views
2

に1つだけの時間、私は仕事のためにそのコードを持っている - ちょうど火ジョブ特定の日時

をスケジューラーを開始するデータベース

public class Job : IJob 
    { 
     private static readonly log4net.ILog log = 
log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); 
     #region IJob Members 
     public void Execute(IJobExecutionContext context) 
     { 
      // This job simply prints out its job name and the 
      // date and time that it is running 
      JobKey jobKey = context.JobDetail.Key; 
      log.InfoFormat("SimpleJob says: {0} executing at {1}", 
jobKey, DateTime.Now.ToString("r")); 
     } 
     #endregion 
    } 

マイシングルトンスケジューラクラスに情報を記録

public class Scheduler 
    { 
     static Scheduler() 
     { 
      NameValueCollection properties = new 
NameValueCollection(); 
      properties["quartz.scheduler.instanceName"] = "myApp"; 
      properties["quartz.scheduler.instanceId"] = "MyApp"; 
      properties["quartz.threadPool.type"] = 
"Quartz.Simpl.SimpleThreadPool, Quartz"; 
      properties["quartz.threadPool.threadCount"] = "10"; 
      properties["quartz.threadPool.threadPriority"] = "Normal"; 
      properties["quartz.scheduler.instanceName"] = 
"TestScheduler"; 
      properties["quartz.scheduler.instanceId"] = 
"instance_one"; 
      properties["quartz.jobStore.type"] = 
"Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; 
      properties["quartz.jobStore.useProperties"] = "true"; 
      properties["quartz.jobStore.dataSource"] = "default"; 
      properties["quartz.jobStore.tablePrefix"] = "QRTZ_"; 
      // if running MS SQL Server we need this 
      properties["quartz.jobStore.lockHandler.type"] = 
"Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz"; 
      properties["quartz.dataSource.default.connectionString"] = 
"Server=localhost;Database=quartzr;Uid=user;Pwd=pass"; 
      properties["quartz.dataSource.default.provider"] = 
"SqlServer-20"; 
      _schedulerFactory = new StdSchedulerFactory(properties); 
      _scheduler = _schedulerFactory.GetScheduler(); 
     } 
     public static IScheduler GetScheduler() 
     { 
      return _scheduler; 
     } 
     private static readonly ISchedulerFactory _schedulerFactory; 
     private static readonly IScheduler _scheduler; 
    } 

のGlobal.asax

void Application_Start(object sender, EventArgs e) 
     { 
      Scheduler.GetScheduler().Start(); 
     } 

ジョブを追加するコード

DateTime SelectedDate = this.Calendar1.SelectedDate; 
       int hour = this.TimeSelector1.Hour; 
       int minute = this.TimeSelector1.Minute; 
       int second = this.TimeSelector1.Second; 
       // First we must get a reference to a scheduler 
       // jobs can be scheduled before sched.start() has been 
called 
       // get a "nice round" time a few seconds in the 
future... 
       DateTimeOffset startTime = DateBuilder.DateOf(hour, 
minute, second, SelectedDate.Day, SelectedDate.Month, 
SelectedDate.Year); 
       try 
       { 
        // job1 will only fire once at date/time "ts" 
        IJobDetail job = JobBuilder.Create<Job>() 
         .WithIdentity("job1", "group1") 
         .Build(); 
        ISimpleTrigger trigger = 
(ISimpleTrigger)TriggerBuilder.Create() 
                    .WithIdentity("trigger1", 
"group1") 
                    .StartAt(startTime) 
                    .Build(); 
        // schedule it to run! 
        DateTimeOffset? ft = 
Scheduler.GetScheduler().ScheduleJob(job, trigger); 
        log.Info(job.Key + 
          " will run at: " + ft); 
        this.Label1.Text = "Zdarzenie dodane"; 
       } 
       catch (Exception ex) 
       { 
        log.Error(ex.Message, ex); 
       } 

問題はジョブがDBに追加したが、それは私が 特定の時点で、すぐにではない解雇ということです:/私はコードで間違った最新のライブラリQuartz.NET 2.0ベータ2 ドゥIのものを使用しますか?私はこのAPIを使い始めます。

答えて

2

Quartz.Netでは、UTCで日付と時刻を渡すことを想定しています。 startTimeのはそれを渡す前に、UTCであることを確認して、

.StartAt(startTime) 

.StartAt(startTime.ToUniversalTime()) 

または DateTimeOffest除く

+0

これは、WithDailyTimeIntervalScheduleがDailyTimeIntervalScheduleBuilderとStartingDailyAtを渡してどのように動作しますか? – Demodave

1

StartAtを、
クォーツためDateBuilderヘルパークラスがあります。この行を変更してみてください。この

var minutesToFireDouble = (futureUTCtime - DateTime.UtcNow).TotalMinutes; 
       var minutesToFire = (int)Math.Floor(minutesToFireDouble); // negative or zero value will set fire immediately 
       var timeToFire = DateBuilder.FutureDate(minutesToFire, IntervalUnit.Minute); 
       var trigger = TriggerBuilder.Create() 
              .WithIdentity("triggerC", "groupC") 
              .StartAt(timeToFire) 
              .WithSimpleSchedule(x => x.WithMisfireHandlingInstructionFireNow()) 
              .Build(); 
0

あなたはすでにあなたがに実行するようにあなたのタスクを必要とするものUTC時間知っている場合、あなたはこのような何かを行うことができます。

UTC開始時間は、ターゲット:12正午に2017年9月1日、

は「あなたのクォーツを設定しますStartTime」次のようにUTC時間形式の

var MyTaskAbcStartTime = "2017-09-01 12:00:00Z" 
.StartAt(MyTaskAbcStartTime) 

リファレンスマイクロソフトのドキュメント: https://docs.microsoft.com/en-us/dotnet/standard/base-types/standard-date-and-time-format-strings

希望は、これは将来のクォーツユーザーのためのいくつかの時間を節約することができます。