Quartz 2.x 中 Scheduler.triggerJob(JobKey, JobDataMap) 重載方法允許在手動觸發任務時傳遞額外參數。但開發者發現:在 Job 實現類的 execute(JobExecutionContext) 方法中,context.getMergedJobDataMap() 取不到傳入的參數,甚至 context 為 null。
triggerJob(JobKey, JobDataMap) 僅用於立即觸發一次執行,不會持久化 JobDetail。JobDataMap 會與 JobDetail 自帶的 JobDataMap 合併,但合併結果只在該次觸發的上下文中有效。execute 簽名,或上下文傳遞異常,會導致取值失敗。public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 1. 合併後的完整 JobDataMap(含 JobDetail 定義 + triggerJob 傳入)
JobDataMap mergedMap = context.getMergedJobDataMap();
// 2. 僅 triggerJob 傳入的參數(不含 JobDetail 原有值)
JobDataMap triggerMap = context.getTrigger().getJobDataMap();
String param1 = mergedMap.getString("param1");
String param2 = mergedMap.getString("param2");
// 後續業務邏輯...
}
}
JobDataMap 區分大小寫,存取時需完全一致。context.getMergedJobDataMap() 獲取完整參數集。context.getJobDetail().getJobDataMap() 與 context.getTrigger().getJobDataMap()。triggerJob 呼叫,驗證參數傳遞鏈路。掌握合併機制,即可在 Quartz 動態觸發場景下靈活傳遞運行時參數。