在项目中的使用需求:
1.可以使用一个A程序定期的去扫描配置文件,然后加载配置文件中的定时任务。
2.也可以随时修改配置文件,使A立即重新加载配置文件
我首先定义一个主程序A,A中定义的时间是半个小时重新加载配置文件。
A程序实例:
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 execute()
{
document = xmlHandle.getXmlFromFile(Config.CONFIG_PATH);
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 如果重启Client端,那么首先将所有的任务队列全部删除,然后重新组装CLIENT端
String[] triggerGroups = scheduler.getTriggerGroupNames();
for (int i = 0; i < triggerGroups.length; i++) {
String[] triggers = scheduler.getTriggerNames(triggerGroups[i]);
for (int j = 0; j < triggers.length; j++) {
Trigger tg = scheduler.getTrigger(triggers[j],
triggerGroups[i]);
if (tg instanceof CronTrigger) {
//在这里要注意,因为Client是删除所有的当前任务然后再重新加载的,但这里不能将调用Client的AppClient的任务删除
if ( tg.getFullName().equals(TRIGGER_GROUP+"."+"CronTrigger_LISTENING")) {// ②-1:根据名称判断
// scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());
}
else
{
scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());
}
}
if (tg instanceof SimpleTrigger) {
scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());
}
}
}
// 创建一个触发器,立即启动,每隔半小时重新加载所有任务,即半小时重新运行AlarmClient的JAVA类.
JobDetail jobDetail = new JobDetail("JOB_MAIL", "Group_MAIL",
AlarmClient.class);
SimpleTrigger simpletrigger = new SimpleTrigger(
"SimpleTrigger_MAIL", TRIGGER_GROUP, new Date(), null,
SimpleTrigger.REPEAT_INDEFINITELY, 30L * 1000L);
scheduler.scheduleJob(jobDetail, simpletrigger);// ④ 注册并进行调度
PrintUtil.printConsole("主程序开始执行...");
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
AlarmClient的程序主要任务就是去读取配置文件,然后根据配置文件中的指定的名称加载所有的子任务。
需求变更,因为有些子任务配置到主程序中,要立即加载到人物队列中。第一种方法就是重启Client.java,现在考虑是否有别的方式实现。我于是想到,另外定义一个客户端,在主配置文件中定义一个reload的标示,定时去扫描该标示,如果为true那么就重新加载,如果为FALSE就不重新加载。
AppClient.java
package client;
import org.dom4j.Document;
import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.quartz.impl.StdSchedulerFactory;
import com.util.Config;
import com.util.DataUtil;
import com.util.Log;
import com.util.PrintUtil;
import com.util.XmlHandle;
public class AppClient {
/**
* @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(Config.CONFIG_PATH);
try {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 如果重启Client端,那么首先将所有的任务队列全部删除,然后重新组装CLIENT端
String[] triggerGroups = scheduler.getTriggerGroupNames();
for (int i = 0; i < triggerGroups.length; i++) {
String[] triggers = scheduler.getTriggerNames(triggerGroups[i]);
for (int j = 0; j < triggers.length; j++) {
Trigger tg = scheduler.getTrigger(triggers[j],
triggerGroups[i]);
//开始这个程序,首先就将任务队列中的所有任务全部干掉。然后开启任务ClientReloadListening.class,该类主要是调用Client.java程序
if (tg instanceof CronTrigger) {
scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());
}
if (tg instanceof SimpleTrigger) {
scheduler.deleteJob(tg.getJobName(), tg.getJobGroup());
}
}
}
// 创建一个触发器,立即启动,每隔10秒扫描主配置文件.
JobDetail jobDetail = new JobDetail("JOB_LISTENING", "Group_LISTENING",
ClientReloadListening.class);
//①-1:创建CronTrigger,指定组及名称
CronTrigger cronTrigger = new CronTrigger("CronTrigger_LISTENING",TRIGGER_GROUP);
CronExpression cexp = new CronExpression("0/10 * * * * ?");//①-2:定义Cron表达式//每隔10秒钟扫描一次主配置文件,如果reload为true,那么就立即重新加载。默认主程序是半个小时重新加载一次
cronTrigger.setCronExpression(cexp);//①-3:设置Cron表达式
scheduler.scheduleJob(jobDetail, cronTrigger);//④ 注册并进行调度
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
}
任务类ClientReloadListening.java
package client;
import org.dom4j.Document;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.util.Config;
import com.util.XmlHandle;
public class ClientReloadListening implements Job {
public static XmlHandle xmlHandle = XmlHandle.getInstance();
public static Document document;
public void execute(JobExecutionContext jec) throws JobExecutionException {
document = xmlHandle.getXmlFromFile(Config.CONFIG_PATH);
//该行代码就是去读取主配置文件中<reload>true</reload>节点的值,如果为TRUE那么就调用Client.execute()
String reload = xmlHandle.getUniqueNodeDataFromXml(document,"/conf/action","reload");
System.out.println(reload);
if("true".equals(reload))
{
Client.execute();
}
}
}