quartz详解1-初探概念

1. quartz

Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。

Builder模式
Factory模式
组件模式
链式写法

1.1 核心概念

调度器
任务
触发器

即:scheduler任务调度、Job任务、Trigger触发器、JobDetail任务细节

1.2 结构体系

JobDetail    trigger(SimpleTrigger和CronTrigger)
    |           |
       |     |
          |
       scheduler
          |
       |     |
start/stop/pause/resume

2. quartz示例

1.新建maven项目,选maven quick-start即可(不选任何框架也行)。

说明:本测试是在已有的聚合项目下新建的module,没有影响的。
项目生成后会自动生成很多dependency,稍作修改。
在父项目的pom添加:

<properties>
    <dependency.version.junit>4.12</dependency.version.junit>
</properties>

<dependencyManagement>
    <dependencies>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${dependency.version.junit}</version>
        </dependency>

    </dependencies>
</dependencyManagement>

子项目的junit就可以不写版本了。

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

maven编译器改成1.8即可。
(上述不是重点,没有父模块,直接写清楚版本是一样的)


2.添加quartz maven依赖

(仓库查询https://mvnrepository.com/artifact/org.quartz-scheduler/quartz
同样将版本号写在父项目pom中

<properties>
     <dependency.version.quartz>2.3.0</dependency.version.quartz>
</properties>

<dependencyManagement>
     <dependencies>
            <!--quartz-->
            <dependency>
                <groupId>org.quartz-scheduler</groupId>
                <artifactId>quartz</artifactId>
                <version>${dependency.version.quartz}</version>
            </dependency>
  </dependencies>
</dependencyManagement>

子模块quartz-test中pom添加:

    <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>${dependency.version.quartz}</version>
    </dependency>

更新依赖。右键–>Maven–>reimport


3.注意:quartz需要slf-log4j日志。
pom

<properties>
     <dependency.version.slf-log4j>1.7.10</dependency.version.slf-log4j>
</properties>

<dependencyManagement>
    <dependencies>
        <!--quartz需要日志依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12z</artifactId>
            <version>${dependency.version.slf-log4j}</version>
        </dependency>

    </dependencies>
</dependencyManagement>

子模块:

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${dependency.version.slf-log4j}</version>
        </dependency>

同时要添加日志属性配置文件在源目录下添加即可
这里写图片描述

log4j.properties内容如下:

### 设置###
#log4j.rootLogger = debug,stdout,D,E
log4j.rootLogger = info,stdout,D,E

### 输出信息到控制抬 ###
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n

### 输出DEBUG 级别以上的日志到=/home/**/logs/debug.log ###
### 相对目录是相对于整个项目而言的
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = quartz-test/logs/debug.log
log4j.appender.D.Append = true
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### 输出ERROR 级别以上的日志到=/home/**/logs/error.log ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
log4j.appender.E.File =quartz-tes/logs/error.log
log4j.appender.E.Append = true
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

有关日志参考:log4j日志详解


4.空的目录结构如下。
这里写图片描述

我们需要定时打印,则需要:

(1)新建Job类

package cn.whbing.pro.quartz;
import org.quartz.Job;
public class printJob implements Job {

}

按提示写出实现

public class printJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //编写具体的业务逻辑即可
    }
}

即如下:

package cn.whbing.pro.quartz;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class PrintJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //编写具体的业务逻辑即可
        //打印当前时间及hello
        LocalDateTime timeNow = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd hh:mm:ss");
        System.out.println("execute time:"+formatter.format(timeNow));

        System.out.println("hello!");
    }
}

2)编写Scheduler类
创建JobDetail、Trigger、Scheduler

1.创建JobDetail实例
2.定义Trigger实例
3.Scheduler实例

package cn.whbing.pro.quartz;

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class PrintScheduler {
    public static void main(String[] args) throws SchedulerException {
        //1.创建JobDetail实例,并与printJob Class绑定
        JobDetail jobDetail = JobBuilder
                .newJob(PrintJob.class)
                .withIdentity("myjob","group1")
                .build();
        //2.定义Trigger实例,定义该job立即执行,并且每隔两秒重复执行一次,直到永远
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("mytrigger","group1")
                .startNow()
                .withSchedule(
                        SimpleScheduleBuilder
                                .simpleSchedule()
                                .withIntervalInSeconds(2)
                                .repeatForever())
                .build();
        //3.通过Scheduler工厂获得Scheduler实例
        SchedulerFactory sf= new StdSchedulerFactory();
        Scheduler scheduler = sf.getScheduler();

        LocalDateTime timeNow = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy MM dd hh:mm:ss");
        System.out.println("Current time:"+formatter.format(timeNow));


        scheduler.scheduleJob(jobDetail,trigger);//*
        scheduler.start();//顺序无关
    }
}

(3)结果:每隔2s打印一次。

Current time:2018 07 30 06:28:49
[INFO ] 2018-07-30 18:28:49,075 method:org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:547)
Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
execute time:2018 07 30 06:28:49
hello!
execute time:2018 07 30 06:28:50
hello!
execute time:2018 07 30 06:28:52
hello!

说明:scheduler.start();放在了后边,可以放*前边。

猜你喜欢

转载自blog.csdn.net/answer100answer/article/details/81284124