java使用quartz定时框架

1,下载jar包

java使用quartz定时框架_第1张图片

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

java使用quartz定时框架_第2张图片

done

你可能感兴趣的:(java使用quartz定时框架)