quartz 中JobExecutionContext的使用


假如execute方法中需要一些額外的數據怎么辦?比如說execute
中希望發送一封郵件,但是我需要知道郵件的發送者、接收者等信息?

存在兩種解決方案:

1.JobDataMap類:
   每個JobDetail都關聯了一個JobDataMap實例,JobDataMap是java.util.Map的子類,基本上是提供key- value形式的數據,並提供了一些便利方法(主要是對java基本數據類型的支持,如put(String key,int value)),當開發人員創建JobDetail的時候,可以把附加信息放到JobDataMap中,那么在execute方法中可以根據key找到需 要的值。
   JobDetail job = new JobDetail....
   job.getJobDataMap().put("from","snowway@vip.sina.com");
   ...  

在execute中
   String from = jobExecutionContext.getJobDetail().getJobDataMap().getString("from");
   ....

   不過,當你使用數據庫存儲JobDetail的時候(默認情況下使用RAM),這里有一個致命的弱點,你不能把沒有實現 java.io.Serializable的對象放入JobDataMap中,因為Quartz將使用Blob字段保存(也可以通過配置文件關閉)序列化 過的JobDataMap中的對象。比如你在execute方法中需要一個java.sql.Connection接口實例,這種情況也是普遍的,那么通 常情況下你不能把Connection放入JobDataMap,即使你只想在execute中使用。(注:讀者可暫時認為上面這段話是正確的,然而可以 通過指示quartz改變這種行為,那屬於高級話題)

2.假如你需要一個java.sql.Connection,用於在execute中完成某些操作,那么你可以把Connection放入Quartz的 SchedulerContext中,execute也可以訪問,並且Quartz不會持久化SchedulerContext中的任何東西。

   scheduler.getContext().put("java.sql.Connection",connection); 

execute中
   Connection con = (Connection)jobExecutionContext.getScheduler().getContext().get("java.sql.Connection");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM