当前位置: 首页 > news >正文

兼职网站建设招聘信息外资公司注册代理

兼职网站建设招聘信息,外资公司注册代理,深圳电信网站备案,大连地区网站建设前言 Quartz 是基于 Java 实现的任务调度框架#xff0c;对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api#xff0c;这意味着开发人员拥有最大的操作权#xff0c;也带来了更高的灵活性。 什么是任务调度#xff1f; 任务调度指在将来某个特定的时间、固…前言 Quartz 是基于 Java 实现的任务调度框架对任务的创建、修改、删除、触发以及监控这些操作直接提供了 api这意味着开发人员拥有最大的操作权也带来了更高的灵活性。 什么是任务调度 任务调度指在将来某个特定的时间、固定的时间周期或规律变化的时间周期到达时自动调度并执行指定的任务。 文章稍长建议点赞收藏点击跳转目录 SpringBoot 整合 Quartz 一、Quartz 是什么 Quartz 是一个开源的作业调度框架它完全由 Java 写成并设计用于 J2SE 和 J2EE 应用中。它提供了巨大的灵活性而不牺牲简单性。你能够用它来为执行一个作业而创建简单的或复杂的调度。它有很多特征如数据库支持集群插件EJB 作业预构建JavaMail 及其它支持 cron-like 表达式等等。 官网地址 http://www.quartz-scheduler.org 示例代码 import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.impl.StdSchedulerFactory;public class QuartzTest {public static void main(String[] args) {try {// Grab the Scheduler instance from the Factory Scheduler scheduler StdSchedulerFactory.getDefaultScheduler();// and start it offscheduler.start();scheduler.shutdown();} catch (SchedulerException se) {se.printStackTrace();}} }在start()和shutdown()之间可以执行一些操作 // define the job and tie it to our HelloJob class JobDetail job JobBuilder.newJob(HelloJob.class).withIdentity(job1, group1).build();// Trigger the job to run now, and then repeat every 40 seconds Trigger triggerTriggerBuilder.newTrigger().withIdentity(trigger1, group1).startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever()) .build();// Tell quartz to schedule the job using our trigger scheduler.scheduleJob(job, trigger);二、核心概念 常用API概述Scheduler与调度程序交互的主要APIJob你想要调度器执行的任务组件需要实现的接口JobDetail用于定义作业的实例Trigger定义执行给定作业的计划的组件JobBuilder用于定义/构建 JobDetail 实例用于定义作业的实例TriggerBuilder用于定义/构建触发器实例 1.任务Job 我们想要调度的任务都必须实现 org.quartz.job 接口然后实现接口中定义的 execute( ) 方法 代码如下示例 Slf4j public class HelloJob implements Job {Overridepublic void execute(JobExecutionContext context) {log.info(Hello Job 执行时间: {}, DateUtil.now());} }那么如何给job实例增加属性或配置呢如何在job的多次执行中跟踪job的状态呢 答案就是 JobDataMapJobDetail对象的一部分。 JobDataMap 可以包含不限量的序列化的数据对象在 job 实例执行的时候可以使用其中的数据 JobDataMap 是 Java Map接口的一个实现额外增加了一些便于存取基本类型的数据的方法。 如下示例 // define the job and tie it to our DumbJob classJobDetail job newJob(DumbJob.class).withIdentity(myJob, group1) // name myJob, group group1.usingJobData(jobSays, Hello World!).usingJobData(myFloatValue, 3.141f).build();public class HelloJob implements Job {public HelloJob() {}public void execute(JobExecutionContext context)throws JobExecutionException{JobKey key context.getJobDetail().getKey();JobDataMap dataMap context.getJobDetail().getJobDataMap();String jobSays dataMap.getString(jobSays);float myFloatValue dataMap.getFloat(myFloatValue);System.err.println(Instance key of HelloJob says: jobSays , and val is: myFloatValue);} }Job 状态 在调用 execute 方法之前都会创建一个新的 Job 实例这就牵引出了 Job 状态的概念 有无状态说明无状态的 Job每次调用时都会创建一个新的 JobDataMap有状态的 Job多次 Job 调用可以持有一些状态信息这些状态信息存储在 JobDataMap 中 跟踪 Job状态时需要在任务类上加个注解PersistJobDataAfterExecution让 Job 变成有状态 Slf4j PersistJobDataAfterExecution public class HelloJob implements Job {private Integer executeCount;public void setExecuteCount(Integer executeCount) {this.executeCount executeCount;}Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {String data LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss));log.info(execute count: {}, current time: {},executeCount, data);//将累加的 count 存入JobDataMap中jobExecutionContext.getJobDetail().getJobDataMap().put(executeCount, executeCount);} } /** OUTPUT: execute count: 1, current time: 2020-11-17 22:28:48 execute count: 2, current time: 2020-11-17 22:28:52 execute count: 3, current time: 2020-11-17 22:28:57 **/2.触发器 Trigger Trigger 作为执行任务的调度器。我们如果想要凌晨1点执行备份数据的任务那么 Trigger 就会设置凌晨1点执行该任务。其中 Trigger 又分为 SimpleTrigger 和 CronTrigger 两种通过一个 TriggerKey 唯一标识 公共属性 属性概述JobKey表示job实例的标识触发器被触发时该指定的job实例会执行StartTime表示触发器的时间表 首次被触发的时间值类型是Java.util.DateEndTime指定触发器的不再触发的时间它的值类型是Java.util.Date 优先级priority 如果 Trigger 有多个你可以为 Trigger 设置 priority优先级 属性priority属性的值可以是任意整数正数、负数优先级高的 Trigger 会被首先触发如果没有为trigger设置优先级trigger使用默认优先级值为5 PS: 只有同时触发的trigger之间才会比较优先级。10:59触发的trigger总是在11:00触发的trigger之前执行。如果trigger是可恢复的在恢复后再调度时优先级与原trigger是一样的。 SimpleTrigger 及 CronTrigger 触发器对比SimpleTrigger在一个指定时间段内执行一次作业任务或是在指定时间间隔内执行多次作业任务CronTrigger基于日历的作业调度器Cron表达式配置CronTrigger的实例而不是像SimpleTrigger那样精确指定间隔时间比SimpleTrigger更常用 SimpleTrigger SimpleTrigger 对于设置和使用是最为简单的一种 QuartzTrigger它是为那种需要在特定的日期/时间启动且以一个可能的间隔时间重复执行 n 次的 Job任务 所设计的。 比如我想要在一个指定的时间段内执行一次任务我们只需要这样写 Trigger trigger TriggerBuilder.newTrigger().withIdentity(testTrigger, testTriggerGroup).startAt(startTime) //自定义执行时间.build();再者我想在指定的时间间隔内多次执行该任务我们可以这样写 Trigger trigger TriggerBuilder.newTrigger().withIdentity(testTrigger, testTriggerGroup).withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).withRepeatCount(2)) // 每5秒执行一次连续执行3次后停止从 0 开始计数.build();我们来总结一下上面的示例 SimpleTrigger具备的属性有开始时间、结束时间、重复次数和重复的时间间隔 重复次数的值可以为 0、正整数、或常量 SimpleTrigger.REPEAT_INDEFINITELY 重复的时间间隔属性值必须大于 0 或长整型的正整数以 毫秒 作为时间单位当重复的时间间隔为 0 时意味着与 Trigger 同时触发执行 结束时间和重复次数同时存在时以结束时间优先 CronTrigger 跟 SimpleTrigger 执行间隔时间触发的相比CronTrigger 更加灵活它是基于日历的作业调度器。使用 CronTrigger 我们可以执行某个时间点执行例如 “每天的凌晨1点执行”、“每个工作日的 12 点执行”也可以像 SimpleTrigger 那样执行一个开始时间和结束时间运行任务 Cron表达式 是用来配置 CronTrigger 实例它是一个由 7 个子表达式组成的字符串在线Cron表达式生成器 使用示例 Trigger trigger TriggerBuilder.newTrigger().withIdentity(testTrigger, testTriggerGroup).withSchedule(CronScheduleBuilder.cronSchedule(0/5 * * 6 4 ?)).build();3.实例 JobDetail Quartz 在每次执行 Job 时都重新创建一个 Job 实例所以它不直接接受一个 Job 的实例相反它接收一个 Job 实现类。描述 Job 的实现类及其它相关的静态信息如 Job 名字、描述等。 JobDetail 为 Job 实例提供了许多设置属性name、group、jobClasS、jobDataMap以及 JobDetaMap 成员变量属性它用来存储特定Job实例的状态信息调度器需要借助 JobDetail 对象来添加 Job 实例。 4.调度器 Scheduler Scheduler为任务的调度器它会将任务 job 及触发器 Trigger 整合起来负责基于 Trigger 设定的时间来执行 Job。 三、体系结构 四、SpringBoot 整合 Quartz 上面我们大概介绍了 Quartz那么该如何使用了请往下看 1.引入依赖 dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactId /dependency2.Quartz 配置 quartz:# 参见 org.springframework.boot.autoconfigure.quartz.QuartzPropertiesjob-store-type: jdbcwait-for-jobs-to-complete-on-shutdown: truescheduler-name: SpringBootDemoSchedulerproperties:org.quartz.threadPool.threadCount: 5org.quartz.threadPool.threadPriority: 5org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread: trueorg.quartz.jobStore.misfireThreshold: 5000org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTXorg.quartz.jobStore.driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate# 在调度流程的第一步也就是拉取待即将触发的triggers时是上锁的状态即不会同时存在多个线程拉取到相同的trigger的情况也就避免的重复调度的危险。org.quartz.jobStore.acquireTriggersWithinLock: true工作数据概述RAMJobStore将其所有数据保存在RAM中是使用最简单的JobStore它也是性能最高的在CPU时间方面JDBCJobStore通过JDBC将其所有数据保存在数据库中 说明 JDBCJobStore几乎与任何数据库一起使用已被广泛应用于OraclePostgreSQLMySQLMSSQLServerHSQLDB和DB2。要使用JDBCJobStore必须首先创建一组数据库表以供Quartz使用。可以在Quartz发行版的docs/dbTables目录中找到表创建SQL脚本 3.自定义任务 HelloJob.java Slf4j public class HelloJob implements Job {Overridepublic void execute(JobExecutionContext context) {log.info(Hello Job 执行时间: {}, DateUtil.now());} }TestJob.java Slf4j public class TestJob implements Job {Overridepublic void execute(JobExecutionContext context) {log.info(Hello Job 执行时间: {}, DateUtil.now());} }4.实现动态管理定时任务 对任务的暂停、恢复、删除等操作只需调用Scheduler 的对应方法即可 JobKey jobKey JobKey.jobKey(“jobName”, “jobGroup”); scheduler.pauseJob(jobKey);//暂停任务 scheduler.resumeJob(jobKey);//恢复任务 scheduler.deleteJob(jobKey);//删除任务 封装任务调度类 JobForm.java Data public class JobForm {/*** 定时任务全类名*/NotBlank(message 类名不能为空)private String jobClassName;/*** 任务组名*/NotBlank(message 任务组名不能为空)private String jobGroupName;/*** 定时任务cron表达式*/NotBlank(message cron表达式不能为空)private String cronExpression; }JobService.java public interface JobService {/*** 添加并启动定时任务** param form 表单参数 * throws Exception 异常*/void addJob(JobForm form) throws Exception;/*** 删除定时任务** param form 表单参数 * throws SchedulerException 异常*/void deleteJob(JobForm form) throws SchedulerException;/*** 暂停定时任务** param form 表单参数 * throws SchedulerException 异常*/void pauseJob(JobForm form) throws SchedulerException;/*** 恢复定时任务** param form 表单参数 * throws SchedulerException 异常*/void resumeJob(JobForm form) throws SchedulerException;/*** 重新配置定时任务** param form 表单参数 * throws Exception 异常*/void cronJob(JobForm form) throws Exception;/*** 查询定时任务列表** param currentPage 当前页* param pageSize 每页条数* return 定时任务列表*/PageInfoJobAndTrigger list(Integer currentPage, Integer pageSize); }JobServiceImpl.java Service Slf4j public class JobServiceImpl implements JobService {private final Scheduler scheduler;private final JobMapper jobMapper;Autowiredpublic JobServiceImpl(Scheduler scheduler, JobMapper jobMapper) {this.scheduler scheduler;this.jobMapper jobMapper;}/*** 添加并启动定时任务*{link JobForm}* return * throws Exception 异常*/Overridepublic void addJob(JobForm form) throws Exception {// 启动调度器scheduler.start();// 构建Job信息JobDetail jobDetail JobBuilder.newJob(JobUtil.getClass(form.getJobClassName()).getClass()).withIdentity(form.getJobClassName(), form.getJobGroupName()).build();// Cron表达式调度构建器(即任务执行的时间)CronScheduleBuilder cron CronScheduleBuilder.cronSchedule(form.getCronExpression());//根据Cron表达式构建一个TriggerCronTrigger trigger TriggerBuilder.newTrigger().withIdentity(form.getJobClassName(), form.getJobGroupName()).withSchedule(cron).build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {log.error(【定时任务】创建失败, e);throw new Exception(【定时任务】创建失败);}}/*** 删除定时任务*{link JobForm}* throws SchedulerException 异常*/Overridepublic void deleteJob(JobForm form) throws SchedulerException {scheduler.pauseTrigger(TriggerKey.triggerKey(form.getJobClassName(), form.getJobGroupName()));scheduler.unscheduleJob(TriggerKey.triggerKey(form.getJobClassName(), form.getJobGroupName()));scheduler.deleteJob(JobKey.jobKey(form.getJobClassName(), form.getJobGroupName()));}/*** 暂停定时任务*{link JobForm}* throws SchedulerException 异常*/Overridepublic void pauseJob(JobForm form) throws SchedulerException {scheduler.pauseJob(JobKey.jobKey(form.getJobClassName(), form.getJobGroupName()));}/*** 恢复定时任务*{link JobForm}* throws SchedulerException 异常*/Overridepublic void resumeJob(JobForm form) throws SchedulerException {scheduler.resumeJob(JobKey.jobKey(form.getJobClassName(), form.getJobGroupName()));}/*** 重新配置定时任务*{link JobForm}* throws Exception 异常*/Overridepublic void cronJob(JobForm form) throws Exception {try {TriggerKey triggerKey TriggerKey.triggerKey(form.getJobClassName(), form.getJobGroupName());// 表达式调度构建器CronScheduleBuilder scheduleBuilder CronScheduleBuilder.cronSchedule(form.getCronExpression());CronTrigger trigger (CronTrigger) scheduler.getTrigger(triggerKey);// 根据Cron表达式构建一个Triggertrigger trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();// 按新的trigger重新设置job执行scheduler.rescheduleJob(triggerKey, trigger);} catch (SchedulerException e) {log.error(【定时任务】更新失败, e);throw new Exception(【定时任务】创建失败);}}/*** 查询定时任务列表** param currentPage 当前页* param pageSize 每页条数* return 定时任务列表*/Overridepublic PageInfoJobAndTrigger list(Integer currentPage, Integer pageSize) {PageHelper.startPage(currentPage, pageSize);ListJobAndTrigger list jobMapper.list();return new PageInfo(list);} }任务调度接口 JobController.java RestController RequestMapping(/job) Slf4j public class JobController {private final JobService jobService;Autowiredpublic JobController(JobService jobService) {this.jobService jobService;}/*** 保存定时任务*/PostMappingpublic ResponseEntityApiResponse addJob(Valid JobForm form) {try {jobService.addJob(form);} catch (Exception e) {return new ResponseEntity(ApiResponse.msg(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);}return new ResponseEntity(ApiResponse.msg(操作成功), HttpStatus.CREATED);}/*** 删除定时任务*/DeleteMappingpublic ResponseEntityApiResponse deleteJob(JobForm form) throws SchedulerException {if (StrUtil.hasBlank(form.getJobGroupName(), form.getJobClassName())) {return new ResponseEntity(ApiResponse.msg(参数不能为空), HttpStatus.BAD_REQUEST);}jobService.deleteJob(form);return new ResponseEntity(ApiResponse.msg(删除成功), HttpStatus.OK);}/*** 暂停定时任务*/PutMapping(params pause)public ResponseEntityApiResponse pauseJob(JobForm form) throws SchedulerException {if (StrUtil.hasBlank(form.getJobGroupName(), form.getJobClassName())) {return new ResponseEntity(ApiResponse.msg(参数不能为空), HttpStatus.BAD_REQUEST);}jobService.pauseJob(form);return new ResponseEntity(ApiResponse.msg(暂停成功), HttpStatus.OK);}/*** 恢复定时任务*/PutMapping(params resume)public ResponseEntityApiResponse resumeJob(JobForm form) throws SchedulerException {if (StrUtil.hasBlank(form.getJobGroupName(), form.getJobClassName())) {return new ResponseEntity(ApiResponse.msg(参数不能为空), HttpStatus.BAD_REQUEST);}jobService.resumeJob(form);return new ResponseEntity(ApiResponse.msg(恢复成功), HttpStatus.OK);}/*** 修改定时任务定时时间*/PutMapping(params cron)public ResponseEntityApiResponse cronJob(Valid JobForm form) {try {jobService.cronJob(form);} catch (Exception e) {return new ResponseEntity(ApiResponse.msg(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);}return new ResponseEntity(ApiResponse.msg(修改成功), HttpStatus.OK);}GetMappingpublic ResponseEntityApiResponse jobList(Integer currentPage, Integer pageSize) {if (ObjectUtil.isNull(currentPage)) {currentPage 1;}if (ObjectUtil.isNull(pageSize)) {pageSize 10;}PageInfoJobAndTrigger all jobService.list(currentPage, pageSize);return ResponseEntity.ok(ApiResponse.ok(Dict.create().set(total, all.getTotal()).set(data, all.getList())));}}演示示例 启动项目输入http://localhost:8080/demo/job.html进入管理界面如图所示 点击添加按钮添加测试任务每秒执行一次 添加完成后查看后台日志成功执行相关任务其他操作类似这里就不一一列举了 五、Quartz 监听器 Quartz的监听器用于当任务调度中你所关注事件发生时能够及时获取这一事件的通知。类似于任务执行过程中的邮件、短信类的提醒 Quartz监听器主要有JobListener、TriggerListener、SchedulerListener三种分别表示任务、触发器、调度器对应的监听器 1.JobListener 任务调度中与任务 Job 相关的事件包括 Job 开始要执行的提示执行完成的提示接口如下 public interface JobListener {String getName();void jobToBeExecuted(JobExecutionContext context);void jobExecutionVetoed(JobExecutionContext context);void jobWasExecuted(JobExecutionContext context,JobExecutionException jobException); }方法说明 getName()用于获取改JobListener 的名称 jobToBeExecuted()Scheduler 在 JobDetail 将要被执行时调用这个方法 jobExecutionVetoed()Scheduler 在 JobDetail 即将被执行但又被 TriggerListener 否决时会调用该方法 jobWasExecuted()Scheduler 在 JobDetail 被执行之后调用这个方法 代码示例 Job 任务类 Slf4j PersistJobDataAfterExecution public class TestJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext){System.out.println(TestJob 执行啦);} }JobListener public class MyJobListener implements JobListener {Overridepublic String getName() {String name getClass().getSimpleName();System.out.println(监听器的名称是 name);return name;}Overridepublic void jobToBeExecuted(JobExecutionContext context) {String jobName context.getJobDetail().getKey().getName();System.out.println(Job的名称是 jobName \tScheduler在JobDetail将要被执行时调用这个方法);}Overridepublic void jobExecutionVetoed(JobExecutionContext context) {String jobName context.getJobDetail().getKey().getName();System.out.println(Job的名称是 jobName \tScheduler在JobDetail即将被执行但又被TriggerListerner否决时会调用该方法);}Overridepublic void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {String jobName context.getJobDetail().getKey().getName();System.out.println(Job的名称是 jobName \tScheduler在JobDetail被执行之后调用这个方法);} }任务调度类 Slf4j public class TestScheduler {public static void main(String[] args) throws Exception {// 获取任务调度的实例Scheduler scheduler StdSchedulerFactory.getDefaultScheduler();// 定义任务调度实例, 并与TestJob绑定JobDetail jobDetail JobBuilder.newJob(TestJob.class).usingJobData(executeCount, 0).withIdentity(testJob, testJobGroup).build();// 定义触发器, 会马上执行一次, 接着5秒执行一次Trigger trigger TriggerBuilder.newTrigger().usingJobData(testInfo, trigger数据存放).withIdentity(testTrigger, testTriggerGroup).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();// 创建并注册一个全局的Job Listenerscheduler.getListenerManager().addJobListener(new MyJobListener(),EverythingMatcher.allJobs());// 使用触发器调度任务的执行scheduler.scheduleJob(jobDetail, trigger);// 开启任务scheduler.start();} } /** OUTPUT: 监听器的名称是MyJobListener Job的名称是testJob Scheduler在JobDetail将要被执行时调用这个方法 TestJob 执行啦 监听器的名称是MyJobListener Job的名称是testJob Scheduler在JobDetail被执行之后调用这个方法 **/2. TriggerListener 任务调度中与触发器 Trigger 相关的事件包括 触发器触发、触发器未正常触发、触发器完成等 public interface TriggerListener {public String getName();public void triggerFired(Trigger trigger, JobExecutionContext context);public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context);public void triggerMisfired(Trigger trigger);public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode); }方法说明 getName()用于获取触发器的名称 triggerFired()当与监听器相关联的Trigger被触发Job上的execute()方法将被执行时Scheduler就调用该方法。 vetoJobExecution()在 Trigger 触发后Job 将要被执行时由 Scheduler 调用这个方法。TriggerListener 给了一个选择去否决 Job 的执行。假如这个方法返回 true这个 Job 将不会为此次 Trigger 触发而得到执行。 triggerMisfired()Scheduler 调用这个方法是在 Trigger 错过触发时。你应该关注此方法中持续时间长的逻辑在出现许多错过触发的 Trigger 时长逻辑会导致骨牌效应。你应当保持这上方法尽量的小。 triggerComplete()Trigger 被触发并且完成了 Job 的执行时Scheduler 调用这个方法。 代码示例 Job 任务类 Slf4j PersistJobDataAfterExecution public class TestJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext){System.out.println(TestJob 执行啦);} }TriggerListener public class MyTriggerListener implements TriggerListener {private String name;public MyTriggerListener(String name) {this.name name;}Overridepublic String getName() {return name;}Overridepublic void triggerFired(Trigger trigger, JobExecutionContext context) {String triggerName trigger.getKey().getName();System.out.println(triggerName 被触发);}Overridepublic boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) {String triggerName trigger.getKey().getName();System.out.println(triggerName 没有被触发);return false; // true表示不会执行Job的方法}Overridepublic void triggerMisfired(Trigger trigger) {String triggerName trigger.getKey().getName();System.out.println(triggerName 错过触发);}Overridepublic void triggerComplete(Trigger trigger, JobExecutionContext jobExecutionContext, Trigger.CompletedExecutionInstruction completedExecutionInstruction) {String triggerName trigger.getKey().getName();System.out.println(triggerName 完成之后触发);}}任务调度类 Slf4j public class TestScheduler {public static void main(String[] args) throws Exception {// 获取任务调度的实例Scheduler scheduler StdSchedulerFactory.getDefaultScheduler();// 定义任务调度实例, 并与TestJob绑定JobDetail jobDetail JobBuilder.newJob(TestJob.class).usingJobData(executeCount, 0).withIdentity(testJob, testJobGroup).build();// 定义触发器, 会马上执行一次, 接着5秒执行一次Trigger trigger TriggerBuilder.newTrigger().usingJobData(testInfo, trigger数据存放).withIdentity(testTrigger, testTriggerGroup).startNow().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();// 创建并注册一个全局的Trigger Listenerscheduler.getListenerManager().addTriggerListener(new MyTriggerListener(simpleTrigger), EverythingMatcher.allTriggers());// 使用触发器调度任务的执行scheduler.scheduleJob(jobDetail, trigger);// 开启任务scheduler.start();} } /** OUTPUT: testTrigger 被触发 testTrigger 没有被触发 TestJob 执行啦 testTrigger 完成之后触发 **/2. SchedulerListener SchedulerListener 会在Scheduler的生命周期中关键事件发生时被调用。与Scheduler有关的事件包括增加一个job/trigger删除一个job/triggerscheduler发生严重错误关闭scheduler等。 public interface SchedulerListener {public void jobScheduled(Trigger trigger);public void jobUnscheduled(String triggerName, String triggerGroup);public void triggerFinalized(Trigger trigger);public void triggersPaused(String triggerName, String triggerGroup);public void triggersResumed(String triggerName, String triggerGroup);public void jobsPaused(String jobName, String jobGroup);public void jobsResumed(String jobName, String jobGroup);public void schedulerError(String msg, SchedulerException cause);public void schedulerStarted();public void schedulerInStandbyMode();public void schedulerShutdown();public void schedulingDataCleared(); }方法说明 jobScheduled()用于部署JobDetail时调用jobUnscheduled()用于卸载JobDetail时调用triggerFinalized()当一个 Trigger 来到了再也不会触发的状态时调用这个方法。除非这个 Job 已设置成了持久性否则它就会从 Scheduler 中移除。triggersPaused()Scheduler 调用这个方法是发生在一个 Trigger 或 Trigger 组被暂停时。假如是 Trigger 组的话triggerName 参数将为 null。triggersResumed()Scheduler 调用这个方法是发生成一个 Trigger 或 Trigger 组从暂停中恢复时。假如是 Trigger 组的话假如是 Trigger 组的话triggerName 参数将为 null。参数将为 null。jobsPaused()当一个或一组 JobDetail 暂停时调用这个方法。jobsResumed()当一个或一组 Job 从暂停上恢复时调用这个方法。假如是一个 Job 组jobName 参数将为 null。schedulerError()在 Scheduler 的正常运行期间产生一个严重错误时调用这个方法。schedulerStarted()当Scheduler 开启时调用该方法schedulerInStandbyMode() 当Scheduler处于StandBy模式时调用该方法schedulerShutdown()当Scheduler停止时调用该方法schedulingDataCleared()当Scheduler中的数据被清除时调用该方法。 代码示例 Job 任务类 Slf4j PersistJobDataAfterExecution public class TestJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext){System.out.println(TestJob 执行啦);} }SchedulerListener public class MySchedulerListener implements SchedulerListener {Overridepublic void jobScheduled(Trigger trigger) {String jobName trigger.getJobKey().getName();System.out.println(jobName 完成部署);}Overridepublic void jobUnscheduled(TriggerKey triggerKey) {System.out.println(triggerKey 完成卸载);}Overridepublic void triggerFinalized(Trigger trigger) {System.out.println(触发器被移除 trigger.getJobKey().getName());}Overridepublic void triggerPaused(TriggerKey triggerKey) {System.out.println(triggerKey 正在被暂停);}Overridepublic void triggersPaused(String triggerGroup) {System.out.println(触发器组 triggerGroup 正在被暂停);}Overridepublic void triggerResumed(TriggerKey triggerKey) {System.out.println(triggerKey 正在从暂停中恢复);}Overridepublic void triggersResumed(String triggerGroup) {System.out.println(触发器组 triggerGroup 正在从暂停中恢复);}Overridepublic void jobAdded(JobDetail jobDetail) {System.out.println(jobDetail.getKey() 添加工作任务);}Overridepublic void jobDeleted(JobKey jobKey) {System.out.println(jobKey 删除工作任务);}Overridepublic void jobPaused(JobKey jobKey) {System.out.println(jobKey 工作任务正在被暂停);}Overridepublic void jobsPaused(String jobGroup) {System.out.println(工作任务组 jobGroup 正在被暂停);}Overridepublic void jobResumed(JobKey jobKey) {System.out.println(jobKey 正在从暂停中恢复);}Overridepublic void jobsResumed(String jobGroup) {System.out.println(工作任务组 jobGroup 正在从暂停中恢复);}Overridepublic void schedulerError(String msg, SchedulerException cause) {System.out.println(产生严重错误时调用 msg cause.getUnderlyingException());}Overridepublic void schedulerInStandbyMode() {System.out.println(调度器在挂起模式下调用);}Overridepublic void schedulerStarted() {System.out.println(调度器 开启时调用);}Overridepublic void schedulerStarting() {System.out.println(调度器 正在开启时调用);}Overridepublic void schedulerShutdown() {System.out.println(调度器 已经被关闭 时调用);}Overridepublic void schedulerShuttingdown() {System.out.println(调度器 正在被关闭 时调用);}Overridepublic void schedulingDataCleared() {System.out.println(调度器的数据被清除时调用);} }任务调度类 Slf4j public class TestScheduler {public static void main(String[] args) throws Exception {// 获取任务调度的实例Scheduler scheduler StdSchedulerFactory.getDefaultScheduler();// 定义任务调度实例, 并与TestJob绑定JobDetail jobDetail JobBuilder.newJob(TestJob.class).usingJobData(executeCount, 0).withIdentity(testJob, testJobGroup).build();// 定义触发器, 会马上执行一次, 接着5秒执行一次Date endTime new Date();endTime.setTime(endTime.getTime()5000);Trigger trigger TriggerBuilder.newTrigger().usingJobData(testInfo, trigger数据存放).withIdentity(testTrigger, testTriggerGroup).startNow().endAt(endTime) //设置了停止时间.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();// 创建SchedulerListenerscheduler.getListenerManager().addSchedulerListener(new MySchedulerListener());// 使用触发器调度任务的执行scheduler.scheduleJob(jobDetail, trigger);// 开启任务scheduler.start();} } /** OUTPUT: testJobGroup.testJob 添加工作任务 testJob 完成部署 调度器 正在开启时调用 调度器 开启时调用 TestJob 执行啦 触发器被移除 testJob testJobGroup.testJob 删除工作任务 **/总结 以上就是今天要讲的内容本文仅仅简单介绍了quartz的入门案例实现动态管理定时任务以上方法亲测有效希望能给大家一个参考。 创作不易关注、点赞、收藏就是对作者最大的鼓励欢迎在下方评论留言
http://www.dnsts.com.cn/news/235050.html

相关文章:

  • 网页设计与网站建设+pdf网站的备案要求吗
  • 狼雨seo网站北京网站制作费用
  • 如何更改网站源码网站建设手机版
  • 旅行社网站系统有哪些做的好的小众网站
  • 公司网站设计注意什么东营市建设
  • 怎么做网站充值网站做网站的图片用什么格式
  • 校园在线网站怎么做教育视频网站开发
  • 陈塘庄做网站公司软件外包多少钱
  • 邯郸移动网站建设用word做网站
  • 网站如何做生僻词引流焦作app网站建设
  • 陇南市响应式网站建设自己网站开发
  • 制作一个网站多少钱上海网站建设科技公司
  • wordpress 导航站模板wordpress 被黑后
  • 八里庄网站建设公司如何自己做网站做淘宝客
  • 网站建设logo设计站长之家网址查询
  • jquery效果网站天猫商城上一年度市场份额
  • 学网站建设好吗手工制作火箭模型
  • 西安注册公司在哪个网站系统怎么创办个人网站
  • 做网站必需要在工商局备案吗福州百度网络推广
  • 建网站要多少钱用自己的服务器.net网站开发后编译
  • 淘宝客网站怎么做seo非交互式网站备案
  • 义乌外贸网站制作百度推广合作
  • 南宁市建设厅官方网站中山企业网站优化
  • 网站做外链的好处软装素材网站有哪些
  • 搜索引擎 网站推广 举例沈阳公司网站设计制作
  • 杭州 网站建设公司郑州有哪些做网站的公司
  • oj网站开发网站宣传方式有哪些
  • vip网站解析建设邯郸网站建设效果好
  • 大连企业做网站公司排名工作总结2023年个人
  • 人防工程做资料的网站品牌网站建设h合肥