定时任务
在Java EE企业级开发中,定时任务(也称为后台调度或周期性任务)是非常常见的一种功能,主要用于执行那些不需要用户交互,但需要按照预定时间间隔或事件触发的任务。Java EE提供了几个框架和API来处理这种需求:
- Java.util.Timer和TimerTask:这是最早的定时任务解决方案,它允许你在主线程之外执行任务。然而,这通常用于一次性任务,不是特别适合复杂的业务逻辑,因为线程安全性较差。
- ScheduledExecutorService:这个API在Java并发包中,提供了更高级别的定时任务支持。你可以创建一个ScheduledFuture对象,它可以延迟执行,定期执行或者在特定的延迟和期限后执行。这是一个线程安全且灵活的选择。
- Quartz Scheduler:这是一个强大的开源任务调度框架,为Java应用程序提供了一种可靠的定时任务执行机制。它支持复杂的调度规则,包括基于日期、时间间隔、cron表达式等,并且提供了易于使用的API和详细的日志记录。
- JSR 223 (Scripting for Java EE):允许你使用脚本语言(如JavaScript、Groovy或Python)编写定时任务,结合了Java的灵活性和这些语言的简洁性。
- Spring框架:Spring提供了内置的TaskExecutor和@Scheduled注解,让你可以在Spring容器中轻松地管理和调度任务,同时还提供了与其他库(如Quartz)集成的能力。
这里说的并不是要去干什么事情
而是定时去做一件工作
其实定时任务在我们的企业级开发 中非常常见
我们做一个定时任务就行哈
在指定时间前把报表计算出来
比如我们之前的缓存计算
每隔1分钟打印一下信息
还有我们的618 双11购物
只要设定在指定时间上架商品就行
示例操作
定时器方法
方法重载
可以设置是任务 还有运行时间
这里用的就是多线程
到达指定时间后执行语句
package com.bigdata1421.demo; import java.util.Timer; import java.util.TimerTask; public class TimerTaskApp { public static void main(String[] args) { //创建一个定时器对象 Timer timer=new Timer(); //用定时器对象调用方法 TimerTask task=new TimerTask() { @Override public void run() { System.out.println("执行"); } }; timer.schedule(task,0,2000); } }
开始不停打印
但人们不满足于此
研发了各种框架
quartz
普及四个概念
导入对应的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
接下来
创建具体执行的工作
创建quartz包下的实现类
就代表创建一个具体任务
这里不是springboot容器
只是一个java对象
package com.bigdata1421.demo.quartz; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springframework.stereotype.Component; public class MyQuartz extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { System.out.println("quartz task run..."); } }
接下来创建配置类
书写绑定
一步一步往下绑定
package com.bigdata1421.demo.config; import com.bigdata1421.demo.quartz.MyQuartz; import org.quartz.*; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class QuartzConfig { @Bean public JobDetail printJobDetail(){ //绑定具体的工作 return JobBuilder.newJob(MyQuartz.class).storeDurably().build(); } @Bean public Trigger printJobTrigger(){ //绑定对应的工作明细 //设置任务时间 秒 分 时 日 月 星期 ScheduleBuilder scheduleBuilder=CronScheduleBuilder.cronSchedule("0/5 * * * * ? "); return TriggerBuilder.newTrigger().forJob(printJobDetail()).withSchedule(scheduleBuilder).build(); } }
可以学习一下这个写写法
叫什么cron表达式
运行boot工程
我们发现 控制台开始打印
我们启动spring容器
发现控制台能一直打印
停止工程 会shutdown
小结
task
我们做完springboot整合Quartz后
我们发现台繁琐了
我们先写了具体要写的类
然后还得写一堆配置类
把他们绑到一块
我们有简化的办法
在启动类里用注解开启定时任务的功能
package com.bigdata1421.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.scheduling.annotation.EnableScheduling; @SpringBootApplication //开启定时任务功能 @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
写一个类
这个类定义了定时任务
package com.bigdata1421.demo.quartz; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @Component public class MyBean { @Scheduled(cron ="0/1 * * * * ?") public void print(){ System.out.println("spring task run"); } }
这样就能一直执行
小结