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();
放在了后边,可以放*
前边。