上篇文章中提到了“定时装置”可以用来实现图书系统得定时提醒管理员图书到期。这个时候用Timer明显有些不方便。这次为大家推荐一个开源组织(OpenSymphony)做的Quartz,Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs复杂得作业调度。我使用的版本是Quartz 1.6。
源码如下:
SimpleQuartzJob.java
package cn.javaoop.dream.quartz;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 读取D盘文件将其内容写入C盘文件中
* @author JavaChaos
*
*/
public class SimpleQuartzJob implements Job {
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println(context.getTrigger().getName());
try {
File file = new File(”D:/test.txt”);
if (file.canExecute()) {
FileWriter writer = new FileWriter(”C:/test.txt”);// 写入C盘文件
FileReader reader = new FileReader(”D:/test.txt”);// 读取D盘文件
writer.write(reader.read());
System.out.println(”写入成功”);
} else {
System.out.println(”文件不存在”);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
SimpleTirggerRunner.java
package cn.javaoop.dream.quartz;
import java.util.Date;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
/**
* 每隔10秒钟检查D盘有无test.txt,如果有则复制到C盘,共执行10次
*
* @author JavaChaos
*
*/
public class SimpleTirggerRunner {
public void task() throws SchedulerException {
// 初始化调度器工厂
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 初始化一个调度器
Scheduler scheduler = schedulerFactory.getScheduler();
// 当前系统时间
long systemTime = System.currentTimeMillis();
// JobDetail对象可以认为需要调度得任务
JobDetail jobDetail = new JobDetail(”jobDetail-s1″,
”jobDetailGroup-s1″, SimpleQuartzJob.class);
// SimpleTrigger对象设置执行的具体事项
SimpleTrigger simpleTrigger = new SimpleTrigger(”simpleTrigger”,
”simpleTriggerGroup”);
// 设置启动时间
simpleTrigger.setStartTime(new Date(systemTime));
// 设置运行时间间隔,1000毫秒为1秒
simpleTrigger.setRepeatInterval(10000);
// 设置运行次数
simpleTrigger.setRepeatCount(10);
// 传入参数
scheduler.scheduleJob(jobDetail, simpleTrigger);
// 启动调度
scheduler.start();
}
public static void main(String[] args) {
try {
SimpleTirggerRunner runner = new SimpleTirggerRunner();
runner.task();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
在这个例子我利用Quartz实现每隔10秒到指定目录下查找某个文件是否存在,如果存在就复制到指定得目录下这一个简单得功能,其实原理和图书到期通知是一样的。
或许能看出这个例子有一点不好之处就是我指定了具体执行得次数,这样很不方便。如果从这个例子来看很难实现每个星期一得下午一点来进行通知管理员这样的功能。
下次会介绍一种表达式,这种表达式可以指定具体运行得时间、周期等等。功能很强大,能够满足我们来做一个图书到期这个功能了。