忘记介绍了,校花的名字是小花
自从上次小花跟我在宾馆的事情(欲知详情请点我)之后,她好几天都没理我,我也不知道他生什么气,可能是不喜欢玩压缩的男生把吧,女生真是麻烦,唉!
为了能让她不再生气,也为了我以后能继续抄她的作业,我约她一起去江边看日落,然后晚上在江边看星星吹江风,顺便请她吃顿饭来讨好她,为了不被她男朋友发现,我还特地花钱让我朋友带她男朋友出去包夜,唉肉疼!
我们约好了五点钟在江亭,下午三点钟我就到了江边,拿出事先准备好的毯子和零食,坐在江边等着小花。
等呀等!等呀等!等到七点钟小花才到,只见她背着一个大包过来,我很疑惑的问她“你被这么大一个包,里面装的啥啊?”
小花:帐篷啊!
Baldwin:你背帐篷干嘛?!?!
小花:你不用帐篷,那直接在地上,那干啥不都被别人看见了?
Baldwin:没事儿!被别人看见怕啥,再说了,你呆在帐篷里不就看不到星星了么!
小花:额~边看星星边玩?那行吧!听起来还挺刺激的,没想到你个Baldwin看起来傻乎乎的,居然这么奔放
Baldwin:这有啥刺激的?不过你来得也太晚了,夕阳都没了,零食被我吃完了
小花:哎呀真是抱歉啊!我今天的闹钟没有响,可能是坏掉了
Baldwin:你那闹钟也太不靠谱了,现在星星出来得不多,我给你讲讲Java定时任务,下次你就可以自己写一个定时器来提醒你做啥事了!
一、相关
定时任务的场景可以说非常广泛,比如有些项目需要定期检查某个节点的状态;比如一些需要定时清理数据的任务等。
一般我们在Java中实现定时任务有四种方法:SpringTask、Quartz、Timer、ScheduledExecutorService,我在项目中常用的是SpringTask。
二、SpringTask
1.相关
SpringTask在Spring3.0之后引入,可以看做轻量级的Quartz,SpringTask的使用非常简单。只需要Spring框架的包即可,支持注解和配置文件两种方式。
2.注解法
相关
我在项目中用的最多的是注解法,因为使用注解,我们只需要在配置文件中声明该注解打开,就可以直接在我们的定时任务上使用注解,而不用再像配置文件法那样,每次都需要修改配置文件。
注解法主要使用的是@Scheduled注解,我们先来看一下该注解的信息
底层
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
该注解共有8个方法(版本4.3.11),他们的作用分别是:
cron:指定cron表达式
zone:设定corn表达式的时区,默认为空字符串
fixedDelay:从上一个任务完成到下一个任务开始的时间间隔(单位:mm)
fixedDelayString:功能同上,只是返回值换为了String
fixedRate:从上一个任务开始到下一个任务开始所间隔的时间(单位:mm)
fixedDelayString:功能同上,只是返回值换为了String
initialDelay:第一次执行任务之前要延迟的时间间隔(单位:mm)
initialDelayString:功能同上,只是返回值换为了String
实践
配置文件启用注解,你的项目可能包括但不仅限于以下的配置
<!--开启注解-->
<mvc:annotation-driven/>
<context:annotation-config/>
<!-- 扫描任务所在的包 -->
<context:component-scan base-package="com.hrms.task"/>
<!-- 定时任务配置 -->
<task:annotation-driven scheduler="printTask" mode="proxy"/>
<task:scheduler id="printTask" pool-size="100" />
创建定时任务,我们在以下任务中规定了一个2S的定时任务
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 15:38
* \* Description:
* \
*/
@Component(value = "baldwinTask")
public class BaldwinTask {
private static final Logger logger = Logger.getLogger("logger");
@Scheduled(fixedRate = 2000)
public void printTask(){
logger.info("My name is Baldwin!!!");
}
}
输出
[2020-03-23 04:19:29,557] Artifact SSM_HRMS:war: Artifact is deployed successfully
[2020-03-23 04:19:29,557] Artifact SSM_HRMS:war: Deploy took 5,312 milliseconds
三月 23, 2020 4:19:31 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:33 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:35 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:37 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:39 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:41 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:43 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:19:45 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
3.配置文件法
配置文件,那么我们就用不上@Scheduled了,在【位置文件中需要直接定位到调度任务文件
实践
文件配置
<context:annotation-config/>
<!-- 扫描任务所在的包 -->
<context:component-scan base-package="com.hrms.task"/>
<!-- 定时任务配置 -->
<task:scheduled-tasks>
<!-- 定位到文件,定位到方法,设置三秒钟 -->
<task:scheduled ref="baldwinTask" method="printTask" fixed-rate="3000"/>
</task:scheduled-tasks>
调度任务文件,注意与注解法中不同
import org.springframework.stereotype.Component;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 15:38
* \* Description:
* \
*/
@Component(value = "baldwinTask")
public class BaldwinTask {
private static final Logger logger = Logger.getLogger("logger");
public void printTask(){
logger.info("My name is Baldwin!!!");
}
}
输出
[2020-03-23 04:30:37,408] Artifact SSM_HRMS:war: Artifact is deployed successfully
[2020-03-23 04:30:37,409] Artifact SSM_HRMS:war: Deploy took 3,229 milliseconds
三月 23, 2020 4:30:40 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:30:43 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:30:46 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
三月 23, 2020 4:30:49 下午 com.hrms.task.BaldwinTask printTask
信息: My name is Baldwin!!!
4.SpringTask总结
因为也经常和spring框架打交道,所以个人比较喜欢使用SpringTask,而且是比较喜欢注解法,注解法进行一次配置之后,不再需要操作配置文件,直接在定时任务中加上注解即可使用,非常的方便。
三、Java-Timer
1.相关
定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的。在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务,但封装任务的类却是TimerTask类。
2.通过继承 TimerTask 类 并实现 run() 方法来自定义要执行的任务
创建一个定时任务
import java.util.TimerTask;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 16:40
* \* Description:
* \
*/
public class BaldwinTimerTask extends TimerTask {
private static final Logger logger = Logger.getLogger("logger");
@Override
public void run() {
logger.info("My Name is Baldwin!!!");
}
}
启动并配置定时任务
import java.text.ParseException;
import java.util.Timer;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 16:52
* \* Description:
* \
*/
public class TaskStart {
private static Timer timer=new Timer();
private static final Logger logger = Logger.getLogger("logger");
public static void main(String[] args) throws ParseException {
logger.info("程序启动!!!");
//设置程序启动后10s才运行
timer.schedule(new BaldwinTimerTask(), 10000);
}
}
输出
"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:D:\tools\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=52795:D:\tools\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;E:\WorkSpaces\IDEAworkspace\SSM_HRMS\target\classes;C:\Users\admin\.m2\repository\org\springframework\spring-core\4.2.9.RELEASE\spring-core-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\admin\.m2\repository\org\springframework\spring-context\4.2.9.RELEASE\spring-context-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\4.2.9.RELEASE\spring-aop-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\4.2.9.RELEASE\spring-expression-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\4.2.9.RELEASE\spring-beans-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\4.2.9.RELEASE\spring-web-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\4.2.9.RELEASE\spring-jdbc-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\4.2.9.RELEASE\spring-tx-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\4.2.9.RELEASE\spring-webmvc-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\mysql\mysql-connector-java\3.1.14\mysql-connector-java-3.1.14.jar;C:\Users\admin\.m2\repository\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;C:\Users\admin\.m2\repository\org\mybatis\mybatis-spring\1.3.1\mybatis-spring-1.3.1.jar;C:\Users\admin\.m2\repository\javax\servlet\jstl\1.2\jstl-1.2.jar;C:\Users\admin\.m2\repository\taglibs\standard\1.1.2\standard-1.1.2.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.11\jackson-databind-2.8.11.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;C:\Users\admin\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\admin\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\admin\.m2\repository\org\springframework\spring-test\4.2.9.RELEASE\spring-test-4.2.9.RELEASE.jar" com.hrms.task.TaskStart
三月 23, 2020 4:56:51 下午 com.hrms.task.TaskStart main
信息: 程序启动!!!
三月 23, 2020 4:57:01 下午 com.hrms.task.BaldwinTimerTask run
信息: My Name is Baldwin!!!
3.总结
我对Timer并不是很熟悉,以上只是凭借记忆写的最简单的例子,如果有兴趣,可以自己去网上搜一下。
四、Quartz框架
1.相关
官网描述:Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application - from the smallest stand-alone application to the largest e-commerce system. Quartz can be used to create simple or complex schedules for executing tens, hundreds, or even tens-of-thousands of jobs; jobs whose tasks are defined as standard Java components that may execute virtually anything you may program them to do. The Quartz Scheduler includes many enterprise-class features, such as support for JTA transactions and clustering.
总结:
Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。
Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。
Quartz 允许程序开发人员根据时间的间隔来调度作业。
Quartz 实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。
2.主要接口
Scheduler - 与调度程序交互的主要API。
Job - 由希望由调度程序执行的组件实现的接口。
JobDetail - 用于定义作业的实例。
Trigger(即触发器) - 定义执行给定作业的计划的组件。
JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。
TriggerBuilder - 用于定义/构建触发器实例。
3.实践
Quartz框架功能完善,全部实现的话篇幅过长,这里只做一个简单的例子,若有需要,再单独开篇。
导入maven
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
创建定时任务
import org.quartz.*;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 17:25
* \* Description:
* \
*/
public class BaldwinQuartzTask implements Job {
private static final Logger logger = Logger.getLogger("logger");
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetail jobDetail = jobExecutionContext.getJobDetail();
//等待传入的值
String age = jobDetail.getJobDataMap().getString("age");
logger.info("My name is Baldwin,my age is "+age);
}
}
定时器入口
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.text.ParseException;
import java.util.Timer;
import java.util.logging.Logger;
/**
* \* User: Baldwin
* \* E_Mail: baldwin@chancellorhk.com || DikeyWang@163.com
* \* Date: 2020/3/23
* \* Time: 16:52
* \* Description:
* \
*/
public class TaskStart {
private static Timer timer=new Timer();
private static final Logger logger = Logger.getLogger("logger");
public static void main(String[] args) throws ParseException {
logger.info("程序启动!!!");
JobDetail jobDetail = JobBuilder.newJob(BaldwinQuartzTask.class)
//传值
.usingJobData("age","18")
.withIdentity("job","task")
.build();
//定义一个Trigger
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger", "task")
//加入 scheduler之后立刻执行
.startNow()
//定时 ,每个3秒钟执行一次
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3)
//重复执行
.repeatForever())
.build();
try {
//创建scheduler
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start(); //运行一段时间后关闭
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
scheduler.shutdown();
} catch (
SchedulerException e) {
e.printStackTrace();
}
}
}
运行结果
"C:\Program Files\Java\jdk1.8.0_211\bin\java.exe" "-javaagent:D:\tools\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=54203:D:\tools\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_211\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_211\jre\lib\rt.jar;E:\WorkSpaces\IDEAworkspace\SSM_HRMS\target\classes;C:\Users\admin\.m2\repository\org\springframework\spring-core\4.2.9.RELEASE\spring-core-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\admin\.m2\repository\org\springframework\spring-context\4.2.9.RELEASE\spring-context-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-aop\4.2.9.RELEASE\spring-aop-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\aopalliance\aopalliance\1.0\aopalliance-1.0.jar;C:\Users\admin\.m2\repository\org\springframework\spring-expression\4.2.9.RELEASE\spring-expression-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-beans\4.2.9.RELEASE\spring-beans-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-web\4.2.9.RELEASE\spring-web-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-jdbc\4.2.9.RELEASE\spring-jdbc-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-tx\4.2.9.RELEASE\spring-tx-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\springframework\spring-webmvc\4.2.9.RELEASE\spring-webmvc-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\mysql\mysql-connector-java\3.1.14\mysql-connector-java-3.1.14.jar;C:\Users\admin\.m2\repository\org\mybatis\mybatis\3.4.1\mybatis-3.4.1.jar;C:\Users\admin\.m2\repository\org\mybatis\mybatis-spring\1.3.1\mybatis-spring-1.3.1.jar;C:\Users\admin\.m2\repository\javax\servlet\jstl\1.2\jstl-1.2.jar;C:\Users\admin\.m2\repository\taglibs\standard\1.1.2\standard-1.1.2.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.8.11\jackson-databind-2.8.11.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.8.0\jackson-annotations-2.8.0.jar;C:\Users\admin\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.8.10\jackson-core-2.8.10.jar;C:\Users\admin\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\admin\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\admin\.m2\repository\org\springframework\spring-test\4.2.9.RELEASE\spring-test-4.2.9.RELEASE.jar;C:\Users\admin\.m2\repository\org\quartz-scheduler\quartz\2.2.1\quartz-2.2.1.jar;C:\Users\admin\.m2\repository\c3p0\c3p0\0.9.1.1\c3p0-0.9.1.1.jar;C:\Users\admin\.m2\repository\org\slf4j\slf4j-api\1.6.6\slf4j-api-1.6.6.jar;C:\Users\admin\.m2\repository\org\quartz-scheduler\quartz-jobs\2.2.1\quartz-jobs-2.2.1.jar" com.hrms.task.TaskStart
三月 23, 2020 5:42:40 下午 com.hrms.task.TaskStart main
信息: 程序启动!!!
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
三月 23, 2020 5:42:40 下午 com.hrms.task.BaldwinQuartzTask execute
信息: My name is Baldwin,my age is 18
三月 23, 2020 5:42:43 下午 com.hrms.task.BaldwinQuartzTask execute
信息: My name is Baldwin,my age is 18
三月 23, 2020 5:42:46 下午 com.hrms.task.BaldwinQuartzTask execute
信息: My name is Baldwin,my age is 18
三月 23, 2020 5:42:49 下午 com.hrms.task.BaldwinQuartzTask execute
信息: My name is Baldwin,my age is 18
4.Quartz总结
Quartz 三要素:
- Scheduler:任务调度器,所有的任务都是从这里开始。
- Trigger:触发器,定义任务执行的方式、间隔。
- JobDetail & Job : 定义任务具体执行的逻辑。
Quartz框架比较复杂,无法在一篇文章描述详细,更多内容敬请期待
五、总结
1.我自己在项目中用SpringTask习惯了,目前正在看Quartz的内容,但是Timer的相关内容暂时不是很熟悉
2.SpringTask算是轻量级的Quartz,如果项目要求不高的话,可以使用SpringTask
3.Quartz是一个纯java开发的开源框架,对于java出身的程序员来讲,不管是api还是文档相对还是很友好的,而且使用起来也很方便。其实quartz最主要的几个接口就是 scheduler·、job、jobdetai、Trigger、jobBuilder。其中最主要的还是Trigger,再深一点,最主要的还是cron表达式。
六、后续
小花捧着头强忍着睡意听着Baldwin的讲解,等到11点钟终于是听完了,于是迫不及待的对Baldwin说“WDNMD,终于讲完了,完事儿了赶紧办正事吧!我跟你说我今天穿的内衣可好看了”
Baldwin:哎哟wc,都十一点了,我得赶紧找你男朋友去了,今晚约了他一起包夜的,再不过去他该着急了
小花:???WDNMD,CSB
Baldwin:溜了溜了,你记得吧垃圾收拾一下啊,我先过去了