假如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");