1,下载jar包
2,新建两个任务
PrintJobEvery3Seconds.java和PrintJobOnMonday10.java
package com.practice.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PrintJobEvery3Seconds implements Job{
private Logger logger = LoggerFactory.getLogger(PrintJobEvery3Seconds.class);
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.info("this message print every three seconds");
}
}
package com.practice.quartz;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PrintJobOnMonday10 implements Job{
private Logger logger = LoggerFactory.getLogger(PrintJobOnMonday10.class);
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
logger.info("this message print every ten seconds");
}
}
3、定时执行
package com.practice.basic;
import org.apache.log4j.PropertyConfigurator;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import com.practice.quartz.PrintJobEvery3Seconds;
import com.practice.quartz.PrintJobOnMonday10;
public class Test002_quartzFrame {
//from w3c
// 每次当scheduler执行job时,在调用其execute(…)方法之前会创建该类的一个新的实例;执行完毕,对该实例的引用就被丢弃了,实例会被垃圾回收;这种执行策略带来的一个后果是,job必须有一个无参的
// 构造函数(当使用默认的JobFactory时);另一个后果是,在job类中,不应该定义有状态的数据属性,因为在job的多次执行中,这些属性的值不会保留。那么如何给job实例增加属性或配置呢?如何在job的
// 多次执行中,跟踪job的状态呢?答案就是:JobDataMap,JobDetail对象的一部分。
//秒 分 时 每月第几天(?) 月 每周第几天(?) (年)
private static final String CRON_EXPRESSION_3SECONDS = "*/3 * * * * ?";//每隔三秒钟执行一次,?用于无指定日期
private static final String CRON_EXPRESSION_MONDAY10 = "0 0 10 ? * MON";//每周一10点执行
private static final String GROUP_NAME = "PrintJob";
public static void main(String[] args) {
JobDetail jobDetail1 = JobBuilder.newJob(PrintJobEvery3Seconds.class)
.withIdentity("job1", GROUP_NAME).build();
JobDetail jobDetail2 = JobBuilder.newJob(PrintJobOnMonday10.class)
.withIdentity("job2", GROUP_NAME).build();
Trigger trigger1 = TriggerBuilder.newTrigger()
.withIdentity("trigger1", GROUP_NAME)
.forJob(jobDetail1)
.withSchedule(CronScheduleBuilder.cronSchedule(CRON_EXPRESSION_3SECONDS))//cron表达式
.build();
Trigger trigger2 = TriggerBuilder.newTrigger()
.withIdentity("trigger2", GROUP_NAME)
.forJob(jobDetail2)
.withSchedule(CronScheduleBuilder.cronSchedule(CRON_EXPRESSION_MONDAY10))
.build();
SchedulerFactory factory = new StdSchedulerFactory();
try {
Scheduler scheduler = factory.getScheduler();
scheduler.scheduleJob(jobDetail1, trigger1);
scheduler.scheduleJob(jobDetail2,trigger2);
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
使用quartz必须配置好log4j,Job的实现类必须是public的,不然newJob报错
4.使用log4j.properties文件配置log4j,默认是从src目录下找
# 日志输出级别(OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL)和输出位置(stdout和R)
log4j.rootCategory=DEBUG,stdout,R
#stdout 输出到控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#必须指定输出布局layout
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#paternlayout 的格式
log4j.appender.stdout.layout.ConversionPattern=[practice1] %p [%t] %C.%M(%L) | %m%n
#R 输出到文件
log4j.appender.R=org.apache.log4j.FileAppender
log4j.appender.R.File=f:/tmp/practice.log
log4j.appender.R.Threshold=INFO
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern= %p [%t] %C.%M(%L) | %m%n
#[QC] %p [%t] %C.%M(%L) | %m%n
#%m 输出代码中指定的消息;%M 输出打印该条日志的方法名;%p 输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL;%r 输出自应用启动到输出该log信息耗费的毫秒数;%c 输出所属的类目,通常就是所在类的全名;
#%t 输出产生该日志事件的线程名;%n 输出一个回车换行符,Windows平台为"rn”,Unix平台为"n”;%d 输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,
#比如:%d{yyyy-MM-dd HH:mm:ss,SSS},输出类似:2002-10-18 22:10:28,921;%l 输出日志事件的发生位置,及在代码中的行数;[QC]是log信息的开头,可以为任意字符,一般为项目简称。
5,run
done