对quartz使用框架调度总结

在项目中的使用需求:

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();
  }

 }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值