java中 @PersistJobDataAfterExecution 详细说明
@PersistJobDataAfterExecution 详细说明
作用
在 Job 执行后持久化 JobDataMap 的更改
工作机制
@PersistJobDataAfterExecution
public class CounterJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// 获取计数器值
int count = dataMap.getInt("executionCount", 0);
count++;
// 更新计数器 - 这个更改会被持久化
dataMap.put("executionCount", count);
System.out.println("任务执行次数: " + count);
}
}
不使用注解的情况
public class NonPersistentJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
int count = dataMap.getInt("executionCount", 0);
count++;
dataMap.put("executionCount", count); // 这个更改不会持久化到下一次执行
System.out.println("计数: " + count); // 每次都是 1
}
}
使用注解的情况
@PersistJobDataAfterExecution
public class PersistentJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
int count = dataMap.getInt("executionCount", 0);
count++;
dataMap.put("executionCount", count); // 更改会被持久化
System.out.println("计数: " + count); // 1, 2, 3, ...
}
}
两个注解的组合使用
最佳实践
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class AdvancedJob implements Job {
private static final String EXECUTION_COUNT_KEY = "executionCount";
private static final String LAST_EXECUTION_TIME_KEY = "lastExecutionTime";
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
// 读取持久化的数据
int executionCount = dataMap.getInt(EXECUTION_COUNT_KEY, 0);
Date lastExecutionTime = (Date) dataMap.get(LAST_EXECUTION_TIME_KEY);
// 业务逻辑
System.out.println("第 " + (executionCount + 1) + " 次执行");
if (lastExecutionTime != null) {
System.out.println("上次执行时间: " + lastExecutionTime);
}
// 更新持久化数据
executionCount++;
dataMap.put(EXECUTION_COUNT_KEY, executionCount);
dataMap.put(LAST_EXECUTION_TIME_KEY, new Date());
// 模拟长时间运行的任务
try {
Thread.sleep(8000); // 执行8秒
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
System.out.println("任务完成,当前计数: " + executionCount);
}
}
浙公网安备 33010602011771号