JOB状态与并发
Posted wangbiaohistory
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JOB状态与并发相关的知识,希望对你有一定的参考价值。
由于job每次被执行时都会创建一个新的实例,
jobDetail实例时,要进行数据存储或者,特殊字段操作,需要每次schedul执行job时保留之前的数据,
那么就需要job在有状态下保持之前的数据信息,从而避免每次scheduler从新创建新的实例的无状态、
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class)
.withIdentity("myjob", "group")
//jobDataMap 在构建JobDetail时,可以将数据放入JobDataMap,
.usingJobData("jobSays", "Hello World!")
.usingJobData("myFloatValue", 3.14f)
.usingJobData("count", 0)
.build();
/**
* :将该注解加到job类上,告诉Quartz不要并发地执行同一个job定义(这里指特定的job类)的多个实例。
* 请注意这里的用词。拿前一小节的例子来说,
* 如果“SalesReportJob”类上有该注解,
* 则同一时刻仅允许执行一个“SalesReportForJoe”实例,
* 但可以并发地执行“SalesReportForMike”类的一个实例。
* 所以该限制是针对JobDetail的,而不是job类的。
* 但是我们认为(在设计Quartz的时候)应该将该注解放在job类上,
* 因为job类的改变经常会导致其行为发生变化。
*/
@DisallowConcurrentExecution //以上是官方文档一堆废话,总结一句就是,限制job的实例(jobDetai)被并发执行
/**此注解
* 多次调用job时都会对job进行持久化,即保存一些特定信息
没有此注解每次实例都会创建一个jobDataMap不会保存上次创建的信息
*/
@PersistJobDataAfterExecution
public class QuartzJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
++count;
System.out.println(jobExecutionContext.getJobDetail().getKey().getName()+"被第"+count+"次调用");
jobExecutionContext.getJobDetail().getJobDataMap().put("count",count);
// System.out.println("此处获取的是融合Map的次数比指定jobDwtail的jobDetailMap次数少一次");
// jobExecutionContext.getMergedJobDataMap().put("count",count);
// System.out.println(jobExecutionContext.getMergedJobDataMap().getIntValue("count"));
}
}
myjob被第1次调用
myjob被第2次调用
myjob被第3次调用
记录jobDetail状态
以上是关于JOB状态与并发的主要内容,如果未能解决你的问题,请参考以下文章
Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题
Spring-batch学习总结—Job,Flow创建及应用,多线程并发,决策器,监听器,参数
Nginx——Nginx启动报错Job for nginx.service failed because the control process exited with error code(代码片段