java中基于线程池和反射机制实现定时任务

来源:互联网 发布:指南针软件怎么退款 编辑:程序博客网 时间:2024/06/06 00:15

文章标题:java中基于线程池和反射机制实现定时任务

文章地址: http://blog.csdn.net/5iasp/article/details/10949925

作者: javaboy2012
Email:yanek@163.com
qq:    1046011462

 

 

 

直接上代码:

 

主要包括如下实现类:

1. Main类:


任务执行的入口:

调用main方法,开始加载任务配置并执行任务

 

package com.yanek.task;import java.util.List;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;public class Main {/** * @param args */public static void main(String[] args) {ScheduledExecutorService scheduExec = Executors.newScheduledThreadPool(1); /*TaskModel tm=new TaskModel();tm.setClassName("com.yanek.task.TaskA");tm.setMethodName("testA");tm.setInitialDelay(3);tm.setPeriod(5);*/List tasks=XmlReader.getTasks();for (int i=0;i<tasks.size();i++){TaskModel tm=(TaskModel)tasks.get(i);scheduExec.scheduleAtFixedRate(new MyTask(tm),tm.getInitialDelay(), tm.getPeriod(), TimeUnit.SECONDS); }}}


2. MyTask 类 实现Runnable接口,在main类中调用

 

package com.yanek.task;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Date;public class MyTask implements Runnable {private TaskModel taskModel;public MyTask() {}public MyTask(TaskModel tm) {this.taskModel = tm;}  public void run() {     System.out.println("call at " + (new Date()));     try {Class<?> classType = Class.forName(taskModel.getClassName());Method getMethod = classType.getMethod(taskModel.getMethodName());getMethod.invoke(classType);     } catch (SecurityException e) {e.printStackTrace(); } catch (IllegalArgumentException e) {e.printStackTrace(); } catch (ClassNotFoundException e) {e.printStackTrace(); } catch (NoSuchMethodException e) {e.printStackTrace(); } catch (IllegalAccessException e) {e.printStackTrace(); } catch (InvocationTargetException e) {e.printStackTrace(); }}}

 3. TaskModel: 对任务类的封装

 

package com.yanek.task;public class TaskModel {public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getMethodName() {return methodName;}public void setMethodName(String methodName) {this.methodName = methodName;}public long getInitialDelay() {return initialDelay;}public void setInitialDelay(long initialDelay) {this.initialDelay = initialDelay;}public long getPeriod() {return period;}public void setPeriod(long period) {this.period = period;}private String className;private String methodName;private long initialDelay;private long period;}


4. XmlReader 任务配置解析类

 

package com.yanek.task;import java.io.File;import java.io.IOException;import java.util.ArrayList;import java.util.List;import org.apache.commons.lang.StringUtils;import org.jdom.Document;import org.jdom.Element;import org.jdom.JDOMException;import org.jdom.input.SAXBuilder;public class XmlReader {public static void main(String[] args) {XmlReader.getTasks();}public static List getTasks() {List tasks = new ArrayList();System.out.println("load task config start...");String path = "/work/TaskManager/conf/taskconfig.xml";File file = new File(path);if (file.exists() && !file.isDirectory()) {try {SAXBuilder sx = new SAXBuilder();Document doc = sx.build(file);Element rootelement = doc.getRootElement();List<Element> childs = rootelement.getChildren();for (int i = 0; i < childs.size(); i++) {TaskModel tModel = new TaskModel();tModel.setClassName(childs.get(i).getChildText("class"));System.out.println(childs.get(i).getChildText("class"));tModel.setMethodName(childs.get(i).getChildText("method"));System.out.println(childs.get(i).getChildText("method"));String initialDelay = childs.get(i).getChildText("initialDelay");tModel.setInitialDelay((Long.valueOf(initialDelay)));System.out.println("距离首次运行还差" + initialDelay + "秒!");tModel.setPeriod(Integer.valueOf(childs.get(i).getChildText("period")));System.out.println(childs.get(i).getChildText("period"));tasks.add(tModel);}} catch (NumberFormatException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (JDOMException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}} else {System.out.println("file no exist!");}System.out.println("load task config end !");return tasks;}}


5. 配置文件:

 

<?xml version="1.0" encoding="UTF-8"?><taskconfig>    <task>    <class>com.yanek.task.TaskA</class>    <method>testA</method>       <initialDelay>5</initialDelay>       <period>2</period>    </task>    <task>    <class>com.yanek.task.TaskB</class>    <method>testB</method>       <initialDelay>5</initialDelay>       <period>3</period>    </task><task>    <class>com.yanek.task.TaskC</class>    <method>testC</method>       <initialDelay>5</initialDelay>       <period>3</period>    </task></taskconfig>


5. 测试任务类:

 

TaskA TaskB TaskC其中定义静态方法 ,这些类的静态方法配置在 xml文件中,被调用。

 

package com.yanek.task;public class TaskA {/** * @param args */public static void main(String[] args) {System.out.println("task a test");}public static void testA(){System.out.println("taska testA method call!");}}


 

package com.yanek.task;public class TaskB {/** * @param args */public static void main(String[] args) {System.out.println("task b test");}public static void testB(){System.out.println("TaskB testB method call!");}}


 

package com.yanek.task;public class TaskC {/** * @param args */public static void main(String[] args) {System.out.println("task c test");}public static void testC(){System.out.println("Taskc testC method call!");}}