2012-12-17 54 views
3

我正在研究Quartz.NET的基本Web客戶端,其中包括支持在運行時修改作業的JobDataMap。如何從遠程客戶端持久化JobDataMap更改

我的工作飾有以下屬性,我相信是所有需要,使工作狀態:

[PersistJobDataAfterExecution] 
[DisallowConcurrentExecution] 
public class SampleTenantJob : IJob { ... } 

在運行時,我執行下面的代碼,但JobDataMap中不保留:

public void UpdateJobProperties(string jobName, string groupName, IDictionary<string, object> properties) 
    { 
     IJobDetail job; 
     if (!TryGetJob(jobName, groupName, out job)) 
      return; 

     foreach (var property in properties) 
     { 
      if (job.JobDataMap.ContainsKey(property.Key) && property.Value != null) 
      { 
       job.JobDataMap.Put(property.Key, property.Value); 
      } 
     } 
    } 

我起初以爲這是因爲我用的是XMLSchedulingDataProcessorPlugin的職位,但我都試過了存儲器(RAMStore)和AdoJobStore,但還是無法堅持被T做JobDataMap變化他是遠程客戶端。

回答

4

PersistJobDataAfterExecution(顧名思義),只有當工作執行完成適用,所以下面的工作將跟蹤的次數是執行

[PersistJobDataAfterExecution] 
public class HelloJob : IJob 
{ 
    public void Execute(IJobExecutionContext context) 
    {   
     int count = (int?) context.MergedJobDataMap["Count"] ?? 1; 

     Console.WriteLine("hello " + count.ToString()); 

     context.JobDetail.JobDataMap.Put("Count" , ++count);  
    } 
} 

沒有PersistJobDataAfterExecution屬性,數量始終是相同的。

由於您沒有運行該作業,因此這對您沒有任何幫助,我認爲您必須使用新的JobDataMap刪除並重新創建作業。

當然,您並不是被迫使用JobDataMap,並且始終可以從其他地方爲您的作業讀取和存儲信息。

+0

「我認爲你必須用新的JobDataMap刪除並重新創建作業。」 - 這是我必須做的,調用'scheduler.AddJob(job,replace:true);' –