网站建设免费软件,新蒲建设集团网站,个人在百度上发广告怎么发,wordpress免费公司官网主题正常定时任务场景 任务1从第0秒开始执行#xff0c;执行3秒结束 任务1再从第5秒开始执行#xff0c;执行3秒结束#xff0c;以此类推
每一个任务执行都不会有冲突#xff0c;都不会有干扰#xff0c;在规定的5秒时间内#xff0c;任务1都能执行完成
定时任务的并发场景…正常定时任务场景 任务1从第0秒开始执行执行3秒结束 任务1再从第5秒开始执行执行3秒结束以此类推
每一个任务执行都不会有冲突都不会有干扰在规定的5秒时间内任务1都能执行完成
定时任务的并发场景 什么是定时任务的并发 任务2从第0秒开始执行执行7秒结束这个定时任务 任务2再从第5秒开始执行这时第一个定时任务由于数量大尚未执行完成任务2 开始第2次任务开始执行7秒结束但是任务2执行的第一次和执行第二次有重叠部分这一部分成为定时任务的并发这一部分有可能处理相同的数据。 案例理解在定时定点给一个用户发短信一个用户只发一次如果是定时任务并发有可能给同一个用户发送2次短信
定时任务并发代码演示
package com.gblfy.job;import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalTime;public class MyJob implements Job {Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {LocalTime localTime LocalTime.now();System.out.println(Thread.currentThread().getName()开始执行 localTime);try {//休眠7秒Thread.sleep(7000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime endTime LocalTime.now();System.out.println(Thread.currentThread().getName()结束执行 endTime);}
} 找一组分析一下
Worker-1开始执行17:55:08
Worker-2开始执行17:55:12
Worker-1结束执行17:55:15
Worker-3开始执行17:55:17
Worker-2结束执行17:55:19
Worker-1开始执行17:55:22
Worker-3结束执行17:55:24定时任务并发数据开始分析
Worker-1和Worker-2 开始执行间隔5秒
Worker-1 开始执行和Worker-1 结束执行 间隔7秒Worker-2和Worker-3 开始执行间隔5秒
Worker-2 开始执行和Worker-2 结束执行 间隔7秒Worker-3和Worker-1 开始执行间隔5秒
Worker-3 开始执行和Worker-3 结束执行 间隔7秒如何防止定时任务并发 在Job类上添加DisallowConcurrentExecution注解
防止并发示例
package com.gblfy.job;import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalTime;DisallowConcurrentExecution
public class MyJob implements Job {Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {LocalTime localTime LocalTime.now();System.out.println(Thread.currentThread().getName() 开始执行 localTime);try {//休眠7秒Thread.sleep(7000);} catch (InterruptedException e) {e.printStackTrace();}LocalTime endTime LocalTime.now();System.out.println(Thread.currentThread().getName() 结束执行 endTime);}
} 找一组分析一下
Worker-1开始执行18:08:17
Worker-1结束执行18:08:24
Worker-2开始执行18:08:24
Worker-2结束执行18:08:31
Worker-3开始执行18:08:31
Worker-3结束执行18:08:38
Worker-1开始执行18:08:42
Worker-1结束执行18:08:49定时任务并发数据开始分析
Worker-1 开始执行和结束执行 间隔7秒
Worker-2 开始执行和结束执行 间隔7秒
Worker-3 开始执行和结束执行 间隔7秒Worker-2 第一次执行应该是 Worker-2开始执行18:08:22但是由于Worker-1还没有结束等待Worker-1执行完成后Worker-2开始执行Worker-3 第一次执行应该是 Worker-3开始执行18:08:27但是由于Worker-2 还没有结束等待Worker-2执行完成后Worker-3开始执行Worker-1 第二次执行应该是 Worker-1 开始执行18:08:32但是由于Worker-3 还没有结束等待Worker-3 执行完成后Worker-1开始执行单这次定时任务会触发Qartz的Misfire的错过机制等到下一个节点执行第2次的Worker-1 Worker-3结束执行18:08:38
Worker-1开始执行18:08:42
从以上数据可以看出当地二次执行 Worker-1时按照上面的规则应该是Worker-1开始执行18:08:38对吧
第1次错过执行Worker-2
第2次错过执行Worker-3
当错过2次定时任务就会Qartz的Misfire的错过机制Qartz的Misfire的错过机制
当定时任务错过2次之后会触发Qartz的Misfire的错过机制触发及之后上面的错过的2次定时任务会取消等到下一个节点执行定时任务。