本文共 6942 字,大约阅读时间需要 23 分钟。
package com.yanek.easytask.core;/** * 任务调度接口 * @author yanek * */public interface Task { /** * 所有都要实现该执行方法,任务被调度时会调用 */ void execute(); /** * 打断执行方法 */ void interrupt();}
package com.yanek.easytask.core;/** * 任务配置实体类 * @author yanek * */public class TaskConfig { private String name; //任务名称 private boolean activity = true; //是否被激活 private String className; //任务执行的类全名 private String scanPeriod; //任务执行的定时表达式配置 public String getScanPeriod() { return scanPeriod; } public void setScanPeriod(String scanPeriod) { this.scanPeriod = scanPeriod; } public String getTaskClass() { return TaskClass; } public void setTaskClass(String taskClass) { TaskClass = taskClass; } private String TaskClass; public boolean isActivity() { return activity; } public void setActivity(boolean activity) { this.activity = activity; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getClassName() { return className; } public void setClassName(String className) { this.className = className; }}
package com.yanek.easytask.core;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;/** * 任务配置xml解析类 * @author yanek * */public class XmlReader { //配置文件路径 public final static String configFileName = "/conf/taskconfig.xml"; public static void main(String[] args) { XmlReader.getTasks(); } public static List getTasks() { Listtasks = new ArrayList (); System.out.println("load task config start..."); File file = new File(Constants.APPLICATION_ROOT_DIR + configFileName); if (file.exists() && !file.isDirectory()) { try { SAXBuilder sx = new SAXBuilder(); Document doc = sx.build(file); Element rootelement = doc.getRootElement(); List childs = rootelement.getChildren(); for (int i = 0; i < childs.size(); i++) { TaskConfig taskConfig = new TaskConfig(); System.out.println("name:"+childs.get(i).getChildText("name")); System.out.println("activity:"+childs.get(i).getChildText("activity")); System.out.println("scanPeriod:"+childs.get(i).getChildText("scanPeriod")); System.out.println("className:"+childs.get(i).getChildText("className")); taskConfig.setName(childs.get(i).getChildText("name")); if (childs.get(i).getChildText("activity").equals("true")) { taskConfig.setActivity(true); } else { taskConfig.setActivity(false); } taskConfig.setScanPeriod(childs.get(i).getChildText("scanPeriod")); taskConfig.setTaskClass(childs.get(i).getChildText("className")); tasks.add(taskConfig); } } catch (NumberFormatException e) { e.printStackTrace(); } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println("task config file no exist!"); } System.out.println("load task config end !"); return tasks; } }
package com.yanek.easytask.core;/** * 任务工厂类 * @author yanek * */public class TaskFactory { /** * 根据任务配置对象,创建任务类的对象实例,采用反射。 * @param config * @return */ public static Task createTask(TaskConfig config) { String classname = config.getTaskClass(); Task task = null; try { task = (Task) Class.forName(classname).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return task; }}
package com.yanek.easytask.core;import org.quartz.InterruptableJob;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.StatefulJob;import org.quartz.UnableToInterruptJobException;public class TaskAdapter implements StatefulJob, InterruptableJob { public TaskAdapter() { } private Task task = null; public void execute(JobExecutionContext context) throws JobExecutionException { Object taskObj = context.getJobDetail().getJobDataMap().get( Constants.JOB_NAME); System.out.println("job类型:" + taskObj); if (taskObj instanceof Task) { task = (Task) taskObj; task.execute(); } else { System.out.println("未知的job类型:" + taskObj.getClass()); } } public void interrupt() throws UnableToInterruptJobException { task.interrupt(); }}
package com.yanek.easytask.core;/** * 系统常量类 */public class Constants{ /** * 应用程序根目录 */ public static String APPLICATION_ROOT_DIR = null; //任务实例名称 public static final String JOB_NAME = "TASK_JOB_INSTANTS";}
package com.yanek.easytask.core;import java.text.ParseException;import java.util.List;import org.quartz.CronTrigger;import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.impl.StdSchedulerFactory;/** * 调度任务服务程序启动入口 * * 启动时需要设置-Dappdir参数,应当设置为-Dappdir=.. * -Dconfig=配置文件文件绝对路径 可选的属性 * * 任务调度使用Quartz实现 * */public class Startup{ /** * @param args */ public static void startup() { } public static void main(String[] args) throws Exception { try { String appdir = System.getProperty("user.dir"); System.out.println(appdir); //设置系统变量 Constants.APPLICATION_ROOT_DIR = appdir; //System.setProperty("appdir","E:\\work\\task"); //初始化调度服务器 initSchedulerServer(); Listtasks=XmlReader.getTasks(); if(tasks == null || tasks.size() <=0) throw new Exception("没有配置任务实例!"); for(int i=0;i
test1 true 0/5 * * * * ? com.yanek.easytask.demo.TaskA test任务2 true 0/5 * * * * ? com.yanek.easytask.demo.TaskDemo
package com.yanek.easytask.demo;import com.yanek.easytask.core.Task;import com.yanek.easytask.core.TaskConfig;public class TaskDemo implements Task { //唯一构造函数 public TaskDemo() { } @Override public void execute() { System.out.println(" TaskDemo execute"); } @Override public void interrupt() { System.out.println("TaskDemo interrupt"); }}
test任务2 true 0/5 * * * * ? com.yanek.easytask.demo.TaskDemo
转载地址:http://tpeal.baihongyu.com/