Quartz中的2個實用的註解

使用過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)
		}
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章