Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
实现定时任务的几种方式_java设置定时任务一小时执行一次,希望能够帮助你!!!。
在项目开发中,经常需要定时任务来后台处理业务,比如定时生成数据报表、生成对账单、数据监控等。Spring Boot 中有两种方案可以选择,第一种是 Spring Boot 内置的注解方式实现,这个方式之前介绍过了,可以看我这篇文章《Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务》,如果需要更复杂的应用场景那么就需要Quartz 实现, Quartz是目前最完善的定时任务框架。接下来一起学习Spring Boot如何整合Quartz 实现定时任务。
Quartz 是非常流行的开源任务调度管理,它是由 Java 开发,具有使用灵活、配置简单的特点。能够实现复杂的应用场景下的任务调度管理。
Quartz 中,有几个非常重要的概念: Job(任务)、 JobDetail(任务信息)、 Trigger(触发器)和Scheduler(调度器),只有熟悉这几个概念,才能明白 Quartz 怎么用。
(1) Job:是个接口,只有一个 execute方法,在实现接口的execute 方法中编写所需要定时执行的 功能;Job 运行时的信息保存在 JobDataMap 实例中。
(2) JobDetail: Quartz 每次调度 Job 时,都创建一个 Job 实例。它主要记录 Job 任务的相关基本信息(如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 对应的Job任务。
(3) Trigger:是一个触发类,描述触发 Job 执行的触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个类。SimpleTrigger 主要用于任务以固定时间间隔周期执行,而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案,如:设置任务每周一到周五的 15: 00~ 16: 00 执行等。
(4) Scheduler:就相当于一个独立运行容器,装载着任务和触发器 , 可以将 Trigger 和 JobDetail 注册到 Scheduler 中, Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。
四者其关系如下图所示:
Spring Boot 2.0 提供了 spring-boot-starter-quartz 组件,它集成 Quartz 框架,让我们在项目中使用 Quartz 变得非常简单。
1、配置 pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
Spring Boot 整合 quartz 非常简单,只需在pom.xml 文件中增加 quartz 依赖即可,无需其他配置。
1、首先定义一个 Job 需要继承 QuartzJobBean,示例中 Job 定义一个变量 Name,用于在定时执行的时候传入。
public class SampleJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println(String.format("Hello %s!", this.name)); } }
2、然后构建 JobDetail,并且构建时传入 name 属性的值,构建 JobTrigger 和 scheduleBuilder,最后使用Scheduler 启动定时任务。
@Configuration public class SampleScheduler { @Bean public JobDetail sampleJobDetail() { return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob") .usingJobData("name", "World").storeDurably().build(); } @Bean public Trigger sampleJobTrigger() { SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever(); return TriggerBuilder.newTrigger().forJob(sampleJobDetail()) .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build(); } }
启动项目后每隔两秒输出:
Hello World! Hello World! Hello World! . . .
JobBuilder 构构造函数,只能通过 JobBuilder 的静态方法 newJob() 生成成 JobBuilder 实例。
withIdentity 方法可以传入两个参数 withIdentity(String name,String group) 来定义 TriggerKey,也可以不设置,像上一示例中会自动生成一个独一无二的 TriggerKey 来区分不同的 Trigger。
以上是创建简单的任务,任务以固定时间间隔周期执行。
CronSchedule 可以设置更灵活的使用方式,定时设置可以参考上面的 cron 表达式。
1、首先定义两个 Job
public class ScheduledJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException{ System.out.println("schedule job1 is running ..."); } }
2、构建 jobDetail、 CronTrigger,最后使用 scheduler 关联 jobDetail 和CronTrigger。 scheduleJob1 设置每间隔 6 秒执行一次。
private void scheduleJob1(Scheduler scheduler) throws SchedulerException{ JobDetail jobDetail = JobBuilder.newJob(ScheduledJob.class) .withIdentity("job1", "group1").build(); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/6 * * * * ?"); CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); }
CronScheduleBuilder.cronSchedule("0/6 * * * * ?"),按照 cron 表达式设置定时任务的执行周期。
3、触发定时任务
public void scheduleJobs() throws SchedulerException { Scheduler scheduler = schedulerFactoryBean.getScheduler(); scheduleJob1(scheduler); scheduleJob2(scheduler); }
以上,就把Spring Boot集成Quartz,实现定时任务。还是比较简单的。还有一个比较重要的点是cron 表达式。这个后面会单独介绍。
这个系列课程的完整源码,也会提供给大家。大家私信我(章为忠学架构)。获取这个系列课程的完整源码。
Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务
Spring Boot入门系列(十五)Spring Boot 开发环境热部署的配置
Spring Boot 使用JdbcTemplate操作数据库,配置多数据源
Maven快速入门(二)手动创建maven项目hellomaven
Maven快速入门(一)Maven介绍及环境搭建
史上最强《Java 开发手册》泰山版,阿里出品,必属精品
Spring Boot入门系列(十三)如何实现事务,极简版!
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章