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!");}}
- java中基于线程池和反射机制实现定时任务
- java中基于TaskEngine类封装实现定时任务
- 使用Java并发包线程池和XML实现定时任务动态配置和管理
- 使用Java并发包线程池和XML实现定时任务动态配置和管理
- java中实现定时任务
- Java中实现定时任务
- 使用线程池和反射实现异步任务
- java 内置定时器实现定时任务和自定义定时任务
- 基于Java线程实现后台定时监控
- java中使用ScheduledThreadPoolExecutor实现定时任务
- java中定时任务的实现
- java中 spring 定时任务 实现代码
- java中定时任务的实现
- java中基于线程池的任务调度设计
- 【java学习】线程和异步任务机制
- 基于cron实现定时任务
- 线程实现定时执行任务
- 定时任务实现 java
- Hibernate主键生成策略
- dB与信噪比(SNR)
- 工程第一阶段(一)
- Windows 7 环境下安装PHP 5.2.17的图文教程
- 使用shop++初始化数据库时出错
- java中基于线程池和反射机制实现定时任务
- JMX的强大功能
- Linux修改进程名称(setproctitle())
- 内核重启的问题,求解?
- 【Cocos2d-x游戏引擎开发笔记(2)】在屏幕上渲染文字
- Java try catch finally的执行顺序
- js插件
- hbase基本概念科普
- SDSF界面