难忘的经历,我与校花的约会(又名:Java中定时任务的三种实现方式及详解)

13 篇文章 1 订阅

忘记介绍了,校花的名字是小花

自从上次小花跟我在宾馆的事情(欲知详情请点我)之后,她好几天都没理我,我也不知道他生什么气,可能是不喜欢玩压缩的男生把吧,女生真是麻烦,唉!

为了能让她不再生气,也为了我以后能继续抄她的作业,我约她一起去江边看日落,然后晚上在江边看星星吹江风,顺便请她吃顿饭来讨好她,为了不被她男朋友发现,我还特地花钱让我朋友带她男朋友出去包夜,唉肉疼!

我们约好了五点钟在江亭,下午三点钟我就到了江边,拿出事先准备好的毯子和零食,坐在江边等着小花。

等呀等!等呀等!等到七点钟小花才到,只见她背着一个大包过来,我很疑惑的问她“你被这么大一个包,里面装的啥啊?”

小花:帐篷啊!

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:溜了溜了,你记得吧垃圾收拾一下啊,我先过去了

评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值