job 在数据库中存储是是一个 class name,意味着其实际的执行内容是可以随时变的—— 它跟着class 文件而变。
这其实给与了 我们很大的灵活性!
job 是线程安全的? 答案是 yes,因为:quartz 是根据 表的 jobClass 字段, 每次创建job 实例,然后执行的!
job 里面可以有成员变量, 但是 因为每次job 都是被new 出来的, 所以如果其属性如不是static,那么每次都要实例这个任务类。。
//这个属性如不是static,那么每次都要实例这个任务类,始终打印为: 1
private static int _counter = 1;
import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.quartz.JobKey; import org.quartz.PersistJobDataAfterExecution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @PersistJobDataAfterExecution @DisallowConcurrentExecution public class ColorJob implements Job { private static Logger _log = LoggerFactory.getLogger(ColorJob.class); public static final String FAVORITE_COLOR = "favorite color"; public static final String EXECUTION_COUNT = "count"; //这个属性如不是static,那么每次都要实例这个任务类,始终打印为: 1 private static int _counter = 1; public ColorJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); JobDataMap data = context.getJobDetail().getJobDataMap(); String favoriteColor = data.getString(FAVORITE_COLOR); int count = data.getInt(EXECUTION_COUNT); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); _log.error("任务Key: " + jobKey + " ,执行时间: " + sdf.format(new Date()) + " " + " 传递参数(favorite color): " + favoriteColor + " " + " 传递参数(count): " + count + " " + " ColorJob静态变量值: " + _counter); count++; data.put(EXECUTION_COUNT, count); _counter++; } }
代码参考 https://blog.csdn.net/yimeng528/article/details/84415579