Quartz是一个功能强大的java计划任务系统,它通过简单的配置和代码完成各种计划人数,定时单机应用到分布式的计算机间远程任务调度,都可以做到。 quartz是一个按照设定的时间规则来调度作业的调度器,比如可以设定每30s启动一个Job,但如果Job在30s内还未完成,那么quartz默认情况下还是按照设定的周期启动新的Job线程 今天刚看了一点资料,做一下笔记。 地址:http://www.opensymphony.com/quartz/ 例子:
Java代码
importjava.util.ArrayList;
importjava.util.Date;
importorg.quartz.JobDetail;
importorg.quartz.Scheduler;
importorg.quartz.SchedulerException;
importorg.quartz.SchedulerFactory;
importorg.quartz.Trigger;
importorg.quartz.TriggerUtils;
importorg.quartz.impl.StdSchedulerFactory;
publicclassTimerTest {
publicstaticvoidmain(String... strings) {
SchedulerFactory schedFact = neworg.quartz.impl.StdSchedulerFactory();
Scheduler sched;
try{
// sched = schedFact.getScheduler();
sched = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetail = newJobDetail("myJob",// job name
sched.DEFAULT_GROUP, // job group (you can also specify 'null' to
// use the default group)
TestJob.class);// the java class to execute
jobDetail.getJobDataMap().put("jobSays","Hello World!");
jobDetail.getJobDataMap().put("myFloatValue",3.141f);
jobDetail.getJobDataMap().put("myStateData",newArrayList());
Trigger trigger = TriggerUtils.makeDailyTrigger(0,1);
trigger.setStartTime(newDate());
trigger.setName("myTrigger");
//Add the given JobDetail to the Scheduler,
//and associate the given Trigger with it.
sched.scheduleJob(jobDetail, trigger); sched.start();
// sched.shutdown();
} catch(SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
import java.util.ArrayList;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.TriggerUtils;
import org.quartz.impl.StdSchedulerFactory;
public class TimerTest {
public static void main(String... strings) {
SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched;
try {
// sched = schedFact.getScheduler();
sched = StdSchedulerFactory.getDefaultScheduler();
JobDetail jobDetail = new JobDetail("myJob", // job name
sched.DEFAULT_GROUP, // job group (you can also specify 'null' to
// use the default group)
TestJob.class); // the java class to execute
jobDetail.getJobDataMap().put("jobSays", "Hello World!");
jobDetail.getJobDataMap().put("myFloatValue", 3.141f);
jobDetail.getJobDataMap().put("myStateData", new ArrayList());
Trigger trigger = TriggerUtils.makeDailyTrigger(0, 1);
trigger.setStartTime(new Date());
trigger.setName("myTrigger");
//Add the given JobDetail to the Scheduler,
//and associate the given Trigger with it.
sched.scheduleJob(jobDetail, trigger); sched.start();
// sched.shutdown();
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Java代码
importjava.util.ArrayList;
importjava.util.Date;
importorg.quartz.Job;
importorg.quartz.JobDataMap;
importorg.quartz.JobExecutionContext;
importorg.quartz.JobExecutionException;
publicclassTestJobimplementsJob {
publicvoidexecute(JobExecutionContext context)throwsJobExecutionException {
// TODO Auto-generated method stub
System.out.println("........................................");
String instName = context.getJobDetail().getName();
String instGroup = context.getJobDetail().getGroup();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
floatmyFloatValue = dataMap.getFloat("myFloatValue");
ArrayList state = (ArrayList) dataMap.get("myStateData");
state.add(newDate());
System.out.println("Instance "+ instName +" of DumbJob says: "+ jobSays);
}
}
import java.util.ArrayList;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class TestJob implements Job {
public void execute(JobExecutionContext context) throws JobExecutionException {
// TODO Auto-generated method stub
System.out.println("........................................");
String instName = context.getJobDetail().getName();
String instGroup = context.getJobDetail().getGroup();
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String jobSays = dataMap.getString("jobSays");
float myFloatValue = dataMap.getFloat("myFloatValue");
ArrayList state = (ArrayList) dataMap.get("myStateData");
state.add(new Date());
System.out.println("Instance " + instName + " of DumbJob says: " + jobSays);
}
}
运行结果如同http://www.opensymphony.com/quartz/wikidocs/QuickStart.html所说的,显示了一堆红色的信息,说明程序读取了默认的Quartz配置,同时已经启动了。 问题1:TestJob 中定义的一些输出信息怎么什么都没有呢,定义了1分钟,但是没有输出? 仔细看了例子代码,发现居然范了一个低级错误,使用了makeDailyTrigger,该方法是定时,每天几点几分进行计划任务,修改为
Java代码
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
Trigger trigger = TriggerUtils.makeSecondlyTrigger(3);
之后没三秒钟就打印:
Java代码
........................................
ance myJob of DumbJob says: Hello World!
........................................
Instance myJob of DumbJob says: Hello World!
TriggerUtils内还有很多其他有用的方法,看quartz API
再增加一个JOB,只需要增加一个job类,jobDetail,Trigger两对象,调用scheduleJob方法就可以加入调度队列了。 这只是一个简单的例子,quartz还有很复杂的功能,继续学习。
引用
分享到:
2008-12-09 20:32
浏览 10097
评论
5 楼 hacker_zxf 2012-04-09
最近再去看quartz实现,job都是new出来的,如果需要自定义job或者干一些私密的事情,可以自定义jobFactory ,塞如scheduler中, 还是很强大的, 可惜扩展新不是非常好,而且版本兼容也不好。
4 楼 hacker_zxf 2012-04-09
quartz 的扩展型做的不好,本来试图将表达式扩展成支持毫秒,但是他的实现默认是每个1秒钟运行一次,判断是否满足时间表达式, 且这个1秒是内部写死,无法扩展, 要做,只能自己写整套的, 悲剧,最后只能选择毫秒用另一个参数了。
3 楼 piaoxue_x 2011-12-01
嗯,看看。。。。貌似不错,谢谢了。。。
2 楼 673341766 2011-10-14
麻烦你看一下 红色的信息是报错好吧.
1 楼 linsea 2009-03-17
自定一个时间表如第每天1点,3点,8点,20点,23:30点等一些时间点,Quartz 是否能按照这个时间表执行同一个计算任务?而且这个时间表是可以随时更改配置更新的.