java中 @PersistJobDataAfterExecution 详细说明

@PersistJobDataAfterExecution 详细说明

作用

在 Job 执行后持久化 JobDataMap 的更改

工作机制

java
@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);
    }
}

不使用注解的情况

java
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
    }
}

使用注解的情况

java
@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, ...
    }
}

两个注解的组合使用

最佳实践

java
@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);
    }
}
posted @ 2025-10-21 08:31  锐洋智能  阅读(0)  评论(0)    收藏  举报