Quartz.Net學習
如果想要對作業執行時提供參數怎么辦?
實際上 JobDetail 提了一個名為 JobDataMap 的屬性來保存作業執行時的參數。
Quartz.Net 甚至為Trigger 也提供了一個JobDataMap的屬性。
JobDetaMap最初是從 IDictionary 繼承下來的,并且通過層層繼承實現了傳遞參數時相關好用的方法。
jobDetail.JobDataMap.Put("hwj383",1);//加入字典表,put和add的區別是put如果有重復鍵會更新值而不是引發異常
最后在 Execute方里面,通過訪問作業執行上下文(Context)中的 JobDetail中的JobDataMap就可以取到值。
public void Execute(JobExecutionContext context)
{
Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383"));
}
public void Execute(JobExecutionContext context) { Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383")); }
但是似乎問題又來了,我們希望保存每次執行的結果,嘗試以下代碼:
public void Execute(JobExecutionContext context)
{
int i = context.JobDetail.JobDataMap.GetInt("hwj383");
Console.WriteLine(i);
i++;
context.JobDetail.JobDataMap.put("hwj383",i);//更新鍵hwj383的值
}
public void Execute(JobExecutionContext context) { int i = context.JobDetail.JobDataMap.GetInt("hwj383"); Console.WriteLine(i); i++; context.JobDetail.JobDataMap.put("hwj383",i);//更新鍵hwj383的值 }
但是遺憾的每次輸出仍然是 1 并沒有隨著每次執行而自動增長 1 (實際上每次執行都會實列化IJob的實現類)
難到就沒有辦了嗎?實際上Quartz.Net為我們提供了另外一個接口:IStatefulJob
從字面意思理解就可以看出是一個狀態接口,此接口會維護第次調用間JobDtatMap數據。只需要把類從IJob接口換成IStatefulJob就可以了,上面的代碼就可以像您想象的工作了。(實際上第次執行仍會實列化IStatefulJob實現類)
實際上 JobDetail 提了一個名為 JobDataMap 的屬性來保存作業執行時的參數。
Quartz.Net 甚至為Trigger 也提供了一個JobDataMap的屬性。
JobDetaMap最初是從 IDictionary 繼承下來的,并且通過層層繼承實現了傳遞參數時相關好用的方法。
jobDetail.JobDataMap.Put("hwj383",1);//加入字典表,put和add的區別是put如果有重復鍵會更新值而不是引發異常
最后在 Execute方里面,通過訪問作業執行上下文(Context)中的 JobDetail中的JobDataMap就可以取到值。
public void Execute(JobExecutionContext context)
{
Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383"));
}
public void Execute(JobExecutionContext context) { Console.WriteLine(context.JobDetail.JobDataMap.GetInt("hwj383")); }
但是似乎問題又來了,我們希望保存每次執行的結果,嘗試以下代碼:
public void Execute(JobExecutionContext context)
{
int i = context.JobDetail.JobDataMap.GetInt("hwj383");
Console.WriteLine(i);
i++;
context.JobDetail.JobDataMap.put("hwj383",i);//更新鍵hwj383的值
}
public void Execute(JobExecutionContext context) { int i = context.JobDetail.JobDataMap.GetInt("hwj383"); Console.WriteLine(i); i++; context.JobDetail.JobDataMap.put("hwj383",i);//更新鍵hwj383的值 }
但是遺憾的每次輸出仍然是 1 并沒有隨著每次執行而自動增長 1 (實際上每次執行都會實列化IJob的實現類)
難到就沒有辦了嗎?實際上Quartz.Net為我們提供了另外一個接口:IStatefulJob
從字面意思理解就可以看出是一個狀態接口,此接口會維護第次調用間JobDtatMap數據。只需要把類從IJob接口換成IStatefulJob就可以了,上面的代碼就可以像您想象的工作了。(實際上第次執行仍會實列化IStatefulJob實現類)
浙公網安備 33010602011771號