Quartz是一个完全由java编写的开源作业调度框架,这里只写基于RAM的,相信你看完本篇,你就学会应用Quartz了,至于持久化应用,我会写在另一篇里,如果对笔者文章或者其他地方有见解或者疑问请下方评论或者至liruli@aliyun.com
启动:start();
暂停:standby();
停止:shutdown();
注意: 使用shutdown()方法后必须重新实例化,否则无法启动;只有当scheduler启动后,即使
处于暂停状态也不行,trigger才会被触发(job才会被执行)。
JobDataMap是Java Map接口的一个实现,额外增加了一些便于存取基本类型的数据的方法;在job实例执行的时候,可以使用其中的数据;
首先得到JobDataMap,然后存键值对:
//得到job JobDetail job = newJob(JobDemo.class).build(); //得到JobDataMap JobDataMap jobDataMap = job.getJobDataMap(); jobDataMap.put("name", "张三"); jobDataMap.put("age", "18"); jobDataMap.put("sex", "男");quartz默认是多线程的,如果执行任务的对象不是单例的,则每个线程都会产生任务对象,这些任务对象的同时执行可能会导致并发问题
@DisallowConcurrentExecution 禁止并发执行多个相同定义的JobDetail, 这个注解是加在Job类上的, 但意思并不是不能同时执行多个Job, 而是不能并发执行同一个Job Definition(由JobDetail定义), 但是可以同时执行多个不同的JobDetail
quartz,java世界里面的任务管理容器。
至于为什么会有misfire这个概念,我想可以重这三个方面来进行说明:
1 所有的线程都在忙于更高优先级的任务
2 任务本身CRASH了
3 代码的BUG,导置错误的设置了JOB
基于这3种原因,其实也是现实世界中的常理。没有任何事情,都能保证100%运行OK。quartz提出了misfire的理论,让任务在错过之后,还能正常的运行。
misfire策略:
使用方法:
public static void testJob() throws SchedulerException{ //quartz工厂类 SchedulerFactory factory = new StdSchedulerFactory(); //get调度器 Scheduler scheduler = factory.getScheduler(); scheduler.start(); //scheduler.standby(); JobDetail job = newJob(JobDemo.class).build();//定时执行的工作 //得到jobKey JobKey jobKey = job.getKey(); int limit_time = 5; //定时设置 SimpleTrigger trigger = (SimpleTrigger) newTrigger() .startAt(futureDate(limit_time, IntervalUnit.SECOND))//秒 .withSchedule(SimpleScheduleBuilder.simpleSchedule() .withMisfireHandlingInstructionIgnoreMisfires())//线程重启恢复策略 .forJob(jobKey) .build(); scheduler.scheduleJob(job, trigger); //停止 //scheduler.shutdown(); } //在触发器中定义也可 SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule(); simpleScheduleBuilder.withIntervalInSeconds(10);//以秒为单位 simpleScheduleBuilder.withRepeatCount(5);//执行次数 simpleScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();