使用過Quartz的兄弟都知道,如果需要編寫一個Quartz任務可以實現org.quartz.Job的接口,然後根據自己的業務需求重寫execute方法。
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//業務
}
}
然而在某些情況下我們可能需要一些全局的參數,它能在整個MyJob的生命週期內提供存取服務。通常情況下我們會將這樣的參數存儲在JobDataMap中,如下:
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
String name = jobDataMap.get("name");
if (name == null) {
jobDataMap.put("name", "小明");
}
}
}
可能我們還希望每次更新JobDataMap後,下一次Job執行能夠獲取到JobDataMap更新後的數據。
Quartz個我們提供了一個註解==@PersistJobDataAfterExecution==,它能夠讓MyJob在執行成功後,更新JobDataMap,使得MyJob在下一次執行後你能獲取更新後的數據。通常情況下這個註解還要配合==@DisallowConcurrentExecution==使用,它使得同一時刻只允許執行一個MyJob實例。因爲當同一個Job的多個實例在併發執行的情況下可能導致JobDataMap的數據是不確定的。使用如下:
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
// 第一次執行成功後count=0,第二次執行成功後count=1。。。
Integer count = jobDataMap.get("count");
if (name == null) {
count = 0;
jobDataMap.put("count", count);
} else {
jobDataMap.put("count", count+1)
}
}
}