采购网站排名,公司网站开发文档,wordpress装在根目录文件夹中_如何通过域名直接访问?,wordpress企业主题购买在项目应用中往往会用到任务定时器的功能#xff0c;比如某某时间#xff0c;或者多少多少秒然后执行某个骚操作等。 spring 支持多种定时任务的实现#xff0c;其中不乏自身提供的定时器。 接下来介绍一下使用 spring 的定时器和使用 quartz 定时器。 前言
spring 自身提供… 在项目应用中往往会用到任务定时器的功能比如某某时间或者多少多少秒然后执行某个骚操作等。 spring 支持多种定时任务的实现其中不乏自身提供的定时器。 接下来介绍一下使用 spring 的定时器和使用 quartz 定时器。 前言
spring 自身提供了定时任务为什么还要使用 quartz 呢 使用 spring 自带的定时任务可以很简单很方便的完成一些简单的定时任务没错这里提到的是简单因此我们想动态的执行我们的定时任务是非常困难的。然而使用 quartz 却可以很容易的管理我们的定时任务很容易动态的操作定时任务。 1、 使用spring的定时器
spring 自带支持定时器的任务实现其可通过简单配置来使用到简单的定时任务。
Component
Configurable
EnableScheduling
public class ScheduledTasks{/*** 方式一* 每6秒执行一次**/Scheduled(fixedRate 6000)public void reportCurrentByCron(){System.out.println (Scheduling Tasks Examples By Cron: The time is now dateFormat ().format (new Date ()));}/*** 方式二* 每6秒执行一次**/Scheduled(cron */6 * * * * * )public void reportCurrentByCron(){System.out.println (Scheduling Tasks Examples By Cron: The time is now dateFormat ().format (new Date ()));}}参数说明
Scheduled 参数可以接受两种定时的设置一种是我们常用的 cron/6 * * * ?一种是 fixedRate 6000两种都可表示固定周期执行定时任务。
fixedRate说明
Scheduled(fixedRate 6000)上一次开始执行时间点之后 6 秒再执行。Scheduled(fixedDelay 6000)上一次执行完毕时间点之后 6 秒再执行。Scheduled(initialDelay1000, fixedRate6000)第一次延迟 1 秒后执行之后按 fixedRate 的规则每 6 秒执行一次。
cron说明
cron 一定有七位数最后一位是年SpringBoot 定时方案只需要设置六位即可:
第一位, 表示秒, 取值是0 ~ 59第二位, 表示分. 取值是0 ~ 59第三位, 表示小时, 取值是0 ~ 23第四位, 表示天/日, 取值是0 ~ 31第五位, 表示月份, 取值是1 ~ 12第六位, 表示星期, 取值是1 ~ 7, 星期一星期二… 还有 1 表示星期日第七位, 年份, 可以留空, 取值是1970 ~ 2099
cron中,还有一些特殊的符号,含义如下:
(*) 星号可以理解为每的意思每秒、每分、每天、每月、每年…。(?) 问号问号只能出现在日期和星期这两个位置表示这个位置的值不确定每天 3 点执行因此第六位星期的位置是不需要关注的就是不确定的值同时日期和星期是两个相互排斥的元素通过问号来表明不指定值比如 1 月 10 日是星期一如果在星期的位置另指定星期二就前后冲突矛盾了。(-) 减号表达一个范围如在小时字段中使用“10 - 12”则表示从 10 到 12 点即 10、11、12。(,) 逗号表达一个列表值如在星期字段中使用“1,2,4”则表示星期一、星期二、星期四。(/) 斜杠如 x/yx 是开始值y 是步长比如在第一位秒0/15 就是从 0 秒开始每隔 15 秒执行一次最后就是 0、15、30、45、60另 */y等同于 0/y。
举几个例子熟悉一下:
0 0 3 * * ? 每天 3 点执行0 5 3 * * ? 每天 3 点 5 分执行0 5 3 ? * * 每天 3 点 5 分执行与上面作用相同0 5/10 3 * * ?每天 3 点的 5 分、15 分、25 分、35 分、45 分、55分这几个时间点执行0 10 3 ? * 1每周星期天3 点 10 分执行注1 表示星期天0 10 3 ? * 1#3每个月的第三个星期星期天执行# 号只能出现在星期的位置。
okspring的定时器就像如上这么简单涉及到的几个注解 EnableScheduling标注启动定时任务。 Scheduled 定义某个定时任务。 2、使用quartz实现定时任务
quartz 的设计者做了一个设计选择来从调度分离开作业。 quartz 中的触发器用来告诉调度程序作业什么时候触发框架提供了一把触发器类型但两个最常用的是 SimpleTrigger 和 CronTrigger。
SimpleTrigger 为需要简单打火调度而设计。典型地如果你需要在给定的时间和重复次数或者两次打火之间等待的秒数打火一个作业那么SimpleTrigger适合你。
另一方面如果你有许多复杂的作业调度那么或许需要CronTrigger。
什么是复杂调度 当你需要在除星期六和星期天外的每天上午10点半执行作业时那么应该使用CronTrigger。正如它的名字所暗示的那样CronTrigger是基于Unix克隆表达式的。 开始之前需要了解的几个概念
Job是一个接口只定义一个方法 executeJobExecutionContext context在实现接口的 execute 方法中编写所需要定时执行的 Job任务JobExecutionContext 类提供了调度应用的一些信息Job 运行时的信息保存在 JobDataMap 实例中。JobDetailQuartz 每次调度 Job 时都重新创建一个 Job 实例因此它不接受一个 Job 的实例相反它接收一个 Job 实现类JobDetail描述 Job 的实现类及其他相关的静态信息如 Job 名字、描述、关联监听器等信息以便运行时通过 newInstance() 的反射机制实例化 Job。Trigger是一个类描述触发 Job 执行的时间触发规则主要有 SimpleTrigger 和 CronTrigger 这两个子类上边刚刚有提到。当且仅当需调度一次或者以固定时间间隔周期执行调度SimpleTrigger 是最适合的选择而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案如工作日周一到周五的 1500 ~ 1600 执行调度等。Scheduler调度器就相当于一个容器装载着任务和触发器该类是一个接口代表一个 Quartz 的独立运行容器Trigger 和 JobDetail 可以注册到 Scheduler 中两者在 Scheduler 中拥有各自的组及名称组及名称是 Scheduler 查找定位容器中某一对象的依据Trigger 的组及名称必须唯一JobDetail 的组和名称也必须唯一但可以和 Trigger 的组和名称相同因为它们是不同类型的。Scheduler 定义了多个接口方法允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。
上边的四个概念建议通读一遍结合下方代码思路更清晰。 SpringBoot2.x 之后完成了对 Quartz 自动化配置集成省去了很多繁琐的配置下面进入正题吧。
2.1、引入依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-quartz/artifactId
/dependency2.2、yml配置
spring:quartz:# 任务信息存储至MEMORY内存方式默认、JDBC数据库方式job-store-type: jdbcproperties:org:quartz:jobStore:misfireThreshold: 1002.3、用于增删改查定时任务的Controller
/*** author niceyoo*/
Slf4j
RestController
Api(description 定时任务管理接口)
RequestMapping(/tmax/quartzJob)
public class TmaxQuartzJobController {/*** 定时任务service*/Autowiredprivate QuartzJobService quartzJobService;/*** 调度器*/Autowiredprivate Scheduler scheduler;RequestMapping(value /add, method RequestMethod.POST)ApiOperation(value 添加定时任务)public ResultObject addJob(ModelAttribute QuartzJob job){add(job.getJobClassName(),job.getCronExpression(),job.getParameter());quartzJobService.save(job);return new ResultUtilObject().setSuccessMsg(创建定时任务成功);}RequestMapping(value /edit, method RequestMethod.POST)ApiOperation(value 更新定时任务)public ResultObject editJob(ModelAttribute QuartzJob job){delete(job.getJobClassName());add(job.getJobClassName(),job.getCronExpression(),job.getParameter());job.setStatus(CommonConstant.STATUS_NORMAL);quartzJobService.update(job);return new ResultUtilObject().setSuccessMsg(更新定时任务成功);}RequestMapping(value /pause, method RequestMethod.POST)ApiOperation(value 暂停定时任务)public ResultObject pauseJob(ModelAttribute QuartzJob job){try {scheduler.pauseJob(JobKey.jobKey(job.getJobClassName()));} catch (SchedulerException e) {throw new TmaxException(暂停定时任务失败);}job.setStatus(CommonConstant.STATUS_DISABLE);quartzJobService.update(job);return new ResultUtilObject().setSuccessMsg(暂停定时任务成功);}RequestMapping(value /resume, method RequestMethod.POST)ApiOperation(value 恢复定时任务)public ResultObject resumeJob(ModelAttribute QuartzJob job){try {scheduler.resumeJob(JobKey.jobKey(job.getJobClassName()));} catch (SchedulerException e) {throw new TmaxException(恢复定时任务失败);}job.setStatus(CommonConstant.STATUS_NORMAL);quartzJobService.update(job);return new ResultUtilObject().setSuccessMsg(恢复定时任务成功);}RequestMapping(value /delByIds/{ids}, method RequestMethod.DELETE)ApiOperation(value 删除定时任务)public ResultObject deleteJob(PathVariable String[] ids){for(String id:ids){QuartzJob job quartzJobService.get(id);delete(job.getJobClassName());quartzJobService.delete(job);}return new ResultUtilObject().setSuccessMsg(删除定时任务成功);}/*** 添加定时任务* param jobClassName* param cronExpression* param parameter*/public void add(String jobClassName, String cronExpression, String parameter){try {//启动调度器scheduler.start();//构建job信息JobDetail jobDetail JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName).usingJobData(parameter, parameter).build();//表达式调度构建器(即任务执行的时间) 使用withMisfireHandlingInstructionDoNothing() 忽略掉调度暂停过程中没有执行的调度CronScheduleBuilder scheduleBuilder CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();//按新的cronExpression表达式构建一个新的triggerCronTrigger trigger TriggerBuilder.newTrigger().withIdentity(jobClassName).withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {log.error(e.toString());throw new TmaxException(创建定时任务失败);} catch (Exception e){throw new TmaxException(后台找不到该类名任务);}}/*** 删除定时任务* param jobClassName*/public void delete(String jobClassName){try {scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName));scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName));scheduler.deleteJob(JobKey.jobKey(jobClassName));} catch (Exception e) {throw new TmaxException(删除定时任务失败);}}public static Job getClass(String classname) throws Exception {Class? class1 Class.forName(classname);return (Job)class1.newInstance();}}
2.4、Job执行的任务类
Slf4j
public class SampleJob implements Job {Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {log.info(String.format(打印时间: DateUtil.now()));}
}4小步代码看完后我们再来分析一波 quartz 的4个核心概念先脑补一张图。 主要看 TmaxQuartzJobController 的 add() 方法
Job 为作业的接口为任务调度的对象在代码中体现为 SampleJob.java代码中是由用户传递过来的类绝对路径JobDetail 用来描述 Job 的实现类及其他相关的静态信息可以看到代码中通过 JobBuilder 的静态方法 newJob(Class jobClass) 生成 JobBuilder 实例其中 jobClass 的获取采用反射机制Trigger 做为作业的定时管理工具一个 Trigger 只能对应一个作业实例而一个作业实例可对应多个触发器代码中采用的是 CronTrigger通过表达式调度构建器构建任务的执行时间注意任务的执行时间是由前台传递过来的 cron 表达式然后按新的 cronExpression 表达式构建一个新的 triggerTriggerBuilder.newTrigger().withIdentity(jobClassName) 表达了一个 Trigger 只能对应一个作业实例Scheduler 做为定时任务容器是 Quartz 最上层的东西它提携了所有触发器和作业使它们协调工作每个 Scheduler 都存有 JobDetail 和 Trigger 的注册一个 Scheduler 中可以注册多个 JobDetail 和多个 Trigger。
最后调用 Controller 层的任务添加方法 /add 完成全部效果如下
2019-05-23 00:38:38.455 INFO 19856 --- [eduler_Worker-1] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:38
2019-05-23 00:38:39.035 INFO 19856 --- [eduler_Worker-2] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:39
2019-05-23 00:38:40.752 INFO 19856 --- [eduler_Worker-3] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:40
2019-05-23 00:38:41.033 INFO 19856 --- [eduler_Worker-4] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:41
2019-05-23 00:38:42.640 INFO 19856 --- [eduler_Worker-5] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:42
2019-05-23 00:38:43.023 INFO 19856 --- [eduler_Worker-6] club.sscai.tmax.quartz.jobs.SampleJob : 打印时间:2019-05-24 09:38:43习惯在微信看技术文章想要获取更多的Java资源的同学可以关注微信公众号niceyoo