156.QUARTZ任务调度框架

    科技2022-08-09  106

    QUARTZ 1四大组成部分

    Scheduler — 调度器,控制所有调度Trigger — 触发条件,采用DSL模式JobDetail — 需要处理的JOBJob — 执行逻辑

    DSL:Domain-specific language,领域特定语言

    针对一个特定的领域,具有受限表达性的一种计算机程序语言,即领域专用语言,声明式编程:

    Method Chaining 方法链、Fluent Style 流畅风格、builder模式构建器Nested Functions 嵌套函数Lambda Expressions/ClosuresFunctional Sequence

    QUARTZ的使用 2

    1.下载

    下载地址:http://www.quartz-scheduler.org/

    使用梯子点击这里传送到下载界面

    2.下载之后解压

    lib文件夹中是可以添加到工程的jar包

    3.给需要使用的工程添加一个名称是lib的文件夹
    4.将会用到的jar包复制到工程的lib文件夹中
    5.构建jar包到工程路径

    这一步不执行工程是不能正常使用包的

    右键所有要使用的jar包,右键添加到路径即可成功:

    拿到example1以及依赖的log4j日志文件进行运行测试

    import java.util.Date; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job { private static Logger _log = LoggerFactory.getLogger(HelloJob.class); public HelloJob() { } public void execute(JobExecutionContext context) throws JobExecutionException { // Say Hello to the World and display the date/time _log.info("Hello World! - " + new Date()); } } /* * quartz学习示例 */ import static org.quartz.DateBuilder.evenMinuteDate; import static org.quartz.DateBuilder.evenSecondDateAfterNow; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; public class SimpleExample { public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleExample.class); log.info("------- Initializing ----------------------"); //1.创建cheduler工厂 SchedulerFactory sf = new StdSchedulerFactory(); //2.从工厂获取调度器 Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // computer a time that is on the next round minute // Date runTime = evenMinuteDate(new Date()); //一分钟后 Date runTime = evenSecondDateAfterNow(); //一秒钟后 /* * evenMinuteDate是DateBuilder的静态方法 */ log.info("------- Scheduling Job -------------------"); //3.创建JobDetail JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); //4.触发器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); //5.注册任务和触发条件 sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); //6.启动 sched.start(); log.info("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! log.info("------- Waiting 65 seconds... -------------"); try { // wait 5 seconds to show job Thread.sleep(5L * 1000L); // executing... } catch (Exception e) { // } // shut down the scheduler log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); } } //3.创建JobDetail JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();

    就是一个DSL流模式

    //间隔执行:每五秒间隔执行一次,总共重复4次 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime) .withSchedule(simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).build();

    对触发器更改,使得中重复执行

    simpleSchedule是静态方法,要引包

    import static org.quartz.SimpleScheduleBuilder.simpleSchedule;

    至少得等待20秒,不然看不全结果

    Thread.sleep(4*5L * 1000L);

    更改后代码如下:
    /* * quartz学习示例 */ import static org.quartz.DateBuilder.evenMinuteDate; import static org.quartz.DateBuilder.evenSecondDateAfterNow; import static org.quartz.SimpleScheduleBuilder.simpleSchedule; import static org.quartz.JobBuilder.newJob; import static org.quartz.TriggerBuilder.newTrigger; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerFactory; import org.quartz.Trigger; import org.quartz.impl.StdSchedulerFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; public class SimpleExample { public void run() throws Exception { Logger log = LoggerFactory.getLogger(SimpleExample.class); log.info("------- Initializing ----------------------"); //1.创建cheduler工厂 SchedulerFactory sf = new StdSchedulerFactory(); //2.从工厂获取调度器 Scheduler sched = sf.getScheduler(); log.info("------- Initialization Complete -----------"); // computer a time that is on the next round minute // Date runTime = evenMinuteDate(new Date()); //一分钟后 Date runTime = evenSecondDateAfterNow(); //一秒钟后 /* * evenMinuteDate是DateBuilder的静态方法 */ log.info("------- Scheduling Job -------------------"); //3.创建JobDetail JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build(); //4.触发器 //执行一次 // Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build(); //间隔执行:每五秒间隔执行一次,总共重复4次 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime) .withSchedule(simpleSchedule().withIntervalInSeconds(5).withRepeatCount(4)).build(); //5.注册任务和触发条件 sched.scheduleJob(job, trigger); log.info(job.getKey() + " will run at: " + runTime); //6.启动 sched.start(); log.info("------- Started Scheduler -----------------"); // wait long enough so that the scheduler as an opportunity to // run the job! log.info("------- Waiting 65 seconds... -------------"); try { // wait 4*5 seconds to show job Thread.sleep(4*5L * 1000L); // executing... } catch (Exception e) { // } // shut down the scheduler log.info("------- Shutting Down ---------------------"); sched.shutdown(true); log.info("------- Shutdown Complete -----------------"); } public static void main(String[] args) throws Exception { SimpleExample example = new SimpleExample(); example.run(); } }

    已集成到Spring中 ↩︎

    可以参考IO_common的使用 128.common-io环境搭建 ↩︎

    Processed: 0.012, SQL: 8