定时任务
在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");
}
}
这样就能一直执行
小结
个人号推广
博客主页
Web后端开发
https://blog.csdn.net/qq_30500575/category_12624592.html?spm=1001.2014.3001.5482
Web前端开发
https://blog.csdn.net/qq_30500575/category_12642989.html?spm=1001.2014.3001.5482
数据库开发
https://blog.csdn.net/qq_30500575/category_12651993.html?spm=1001.2014.3001.5482
项目实战
https://blog.csdn.net/qq_30500575/category_12699801.html?spm=1001.2014.3001.5482
算法与数据结构
https://blog.csdn.net/qq_30500575/category_12630954.html?spm=1001.2014.3001.5482
计算机基础
https://blog.csdn.net/qq_30500575/category_12701605.html?spm=1001.2014.3001.5482
回忆录
https://blog.csdn.net/qq_30500575/category_12620276.html?spm=1001.2014.3001.5482