三. 作业任务的并发控制
并发控制,用的是 @DisallowConcurrentExecution 注解, 需要将这个注解放置到工作任务上, 就会形成类似锁的情形。
如果一个任务需要执行很长时间,并且触发器的触发时间较短,导致造成任务等待的问题,一定要处理并发控制。
注解路径: org.quartz.DisallowConcurrentExecution 。
三.一 任务接口
添加 @DisallowConcurrentExecution 注解, 并且休眠5s钟。
@DisallowConcurrentExecution public class MyJob11 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } //要做的事,是打印当前的时间 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //格式化时间 String dateString=sdf.format(new Date()); System.out.println("备份数据库的时间是:"+dateString); } }
三.二 主程序测试
触发时间为2s, 远远小于 休眠的5s, 会造成任务等待。
//挂起 standby public class SchedulerDemo11 { public static void main(String[] args) throws Exception{ //获取Scheduler Scheduler scheduler= StdSchedulerFactory.getDefaultScheduler(); // 创建 JobDetail JobDetail jobDetail=JobBuilder.newJob(MyJob11.class) .withIdentity("job1","group1") .build(); //创建 Trigger Trigger trigger= TriggerBuilder.newTrigger() .withIdentity("trigger1","group1") //设置标识 .startNow() .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)) // 设置为简单触发器 .build(); //关联 job和 trigger scheduler.scheduleJob(jobDetail,trigger); //启动 scheduler scheduler.start(); //休眠10s后,挂起 Thread.sleep(10000); scheduler.standby(); //挂起10s后,重新开启 Thread.sleep(10000); scheduler.start(); } }
三.三 控制台打印输出
并不会出现重复执行的问题。
三.四 shutdown() 时添加 @DisallowConcurrentExecution 注解
在 MyJob10.java 上面也添加这个注解
shutdown(false) 时运行程序:
shutdown(true) 时运行程序:
同样,可以达到并发控制的目的。
谢谢您的观看!!!