首先关于Quartz的一篇详细介绍的文章可以参考我博客中的一篇关于介绍该框架的文章。
我做的该项目是一个网站预警系统,通过自己定义一个抽象类,采用策略模式,然后相关的监控子程序继承该类,配置配置文件的方式集成到预警系统中。
首先我通过我的主客户端程序的例子来解释Quartz来介绍我常用到的API
注释:QUARTZ中首先是一个组对应多个trigger
package client;
import org.dom4j.Document;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import com.util.DataUtil;
import com.util.Log;
import com.util.PrintUtil;
import com.util.XmlHandle;
public class Client {
/**
* @param args
*/
public static XmlHandle xmlHandle = XmlHandle.getInstance();
public static Document document ;
public static String TRIGGER_GROUP="JOBCN_GROUP_MAIL";//我自己制定的组名称,指定名称
public static void main(String[] args) {
document = xmlHandle.getXmlFromFile("conf\\alarm-config.xml");
try {
String reload = xmlHandle.getSingleXmlData(document,"/conf","reload");
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
if("".equals(reload)||reload==null||"true".equals(reload))
{
}
//如果重启Client端,那么首先将所有的任务队列全部删除,然后重新组装CLIENT端
String[] triggerGroups = scheduler.getTriggerGroupNames();//该方法是得到所有的组名称
for (int i = 0; i < triggerGroups.length; i++) {
String[] triggers = scheduler.getTriggerNames(triggerGroups[i]);//该方法是得到该组里面所有的trigger
for (int j = 0; j < triggers.length; j++) {
Trigger tg = scheduler.getTrigger(triggers[j],
triggerGroups[i]);
if (tg instanceof CronTrigger)
{
//System.out.println(tg.getFullName()+":"+TRIGGER_GROUP+"."+"CronTrigger_"+bean.getClassName());
//System.out.println(tg.getJobName()+":"+tg.getJobGroup());
scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());//该方法是删除指定的任务,传入的是trigger的名字和组名
}
}
}
JobDetail jobDetail = new JobDetail("JOB_MAIL", "Group_MAIL",AlarmClient.class);
//①-1:创建CronTrigger,指定组及名称
JobDataMap dataMap = new JobDataMap();
dataMap.put("bean", bean);//我们可以将我们要传入的某个类通过JobDataMap的载体传到对应的job中
jobDetail.setJobDataMap(dataMap);
CronTrigger cronTrigger = new CronTrigger("CronTrigger_MAIL",TRIGGER_GROUP);
CronExpression cexp = new CronExpression("0/30 * * * * ?");//①-2:定义Cron表达式
cronTrigger.setCronExpression(cexp);//①-3:设置Cron表达式
scheduler.scheduleJob(jobDetail, cronTrigger);//④ 注册并进行调度
scheduler.start();
} catch (Exception e) {
//e.printStackTrace();
}
}
}
具体任务类的定义,只注明主体方法:
public void execute(JobExecutionContext jobCtx) throws JobExecutionException {
//我们制定一个具体的任务,必须实现execute方法,该方法传入一个job的上下文,通过下面的代码来得到保存在datamap中的数据,注意,如果要通过载体传输的数据一定要实现Serializable接口
例如:我们传的 public class AlarmBean implements Serializable
JobDetail jobDetail =jobCtx.getJobDetail();
JobDataMap dataMap = jobDetail.getJobDataMap();
this.bean = getBean(dataMap);
System.out.println("Test:"+bean.getMailHost());
}
public AlarmBean getBean(Map map)
{
AlarmBean beans = null;
Iterator it = map.entrySet().iterator();
while(it.hasNext())
{
try {
Map.Entry m = (Map.Entry) it.next();
beans = (AlarmBean) m.getValue();
} catch (Exception e) {
e.printStackTrace();
}
}
return beans;
}