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

本文实例讲述了java基于线程池和反射机制实现定时任务的方法。分享给大家供大家参考,具体如下:

主要包括如下实现类:

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 block
    e.printStackTrace();
   } catch (JDOMException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.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>

6. 测试任务类:

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程序设计有所帮助。

(0)

相关推荐

  • java 利用反射机制,获取实体所有属性和方法,并对属性赋值

    一个普通的实体Person: private int id; private String name; private Date createdTime; ... //其它字段 // get set方法 ............... 现在需要把通过webService传过来的实体Person里面的所有字段的null值,换成"" 实现思路: 1.获取实体的所有字段,遍历 2.获取字段类型 3.调用字段的get方法,判断字段值是否为空 4.如果字段值为空,调用字段的set方法,为字段赋值

  • Java反射机制的实现详解

    很多主流框架都使用了反射技术.像ssh框架都采用两种技术 xml做配置文件+反射技术. 与反射有关的类包. java.lang.reflect.*;和java.lang.Class; Java中所有类型(包括基本类型)都对应一个Class对象,这个Class就是java.lang.Class.即每一个类型,在Class中都有一个Class对象跟它对应.Class 没有公共构造方法.注意不是没有,是没有公共的. 如何获得Class对象 复制代码 代码如下: .针对每一个对象.getCalss(),

  • JAVA反射机制实例教程

    本文以实例形式详细讲述了Java的反射机制,是Java程序设计中重要的技巧.分享给大家供大家参考.具体分析如下: 首先,Reflection是Java 程序开发语言的特征之一,它允许运行中的 Java 程序对自身进行检查,或者说"自审",并能直接操作程序的内部属性.例如,使用它能获得 Java 类中各成员的名称并显示出来. Java 的这一能力在实际应用中也许用得不是很多,但是在其它的程序设计语言中根本就不存在这一特性.例如,Pascal.C 或者 C++ 中就没有办法在程序中获得函数

  • Java的反射机制---动态调用对象的简单方法

    唉!我还真是在面试中学习新东东啊,一个公司刚刚给了个测试,不过我很奇怪的是为什么web developer的职位居然考java的反射机制题,不过学习研究一下反射机制对我来说是件好事啦! 先说说什么是java反射机制吧,在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这 种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.主要功能:在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对 象:在运行时判断任意一个

  • Java反射机制概念、原理与用法总结

    本文实例讲述了Java反射机制概念.原理与用法.分享给大家供大家参考,具体如下: 反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 反射机制能做什么 反射机制主要提供了以下功能: ① 在运行时判断任意一个对象所属的类: ② 在运行时构造任意一个类的对象: ③ 在运行时判断任意一个类所具有的成员变量和方法: ④ 在运行时调用任意一个

  • Java反射机制的学习总结

    一.什么是反射机制 简单的来说,反射机制指的是程序在运行时能够获取自身的信息.在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息. 二.哪里用到反射机制 有些时候,我们用过一些知识,但是并不知道它的专业术语是什么,在刚刚学jdbc时用过一行代码, Class.forName("com.mysql.jdbc.Driver.class").newInstance();但是那时候只知道那行代码是生成驱动对象实例,并不知道它的具体含义.听了反射机制这节课后,才知道,原来这

  • Java反射机制及Method.invoke详解

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理. 1. 得到某个对象的属性 复制代码 代码如下: public Object get

  • 利用java反射机制调用类的私有方法(推荐)

    试想一下,如果你可以轻易地调用一个类的私有方法,那么是不是说你的封装都失效了?最近在看java的反射机制,发现居然可以利用java的反射机制去调用其他类的私有方法,至于这能干什么,那就见人见智了.. 我写的一段简易实例代码如下: import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * @author thomaslwq * @version 创建时间:Sep 4, 201

  • java 利用java反射机制动态加载类的简单实现

    如下所示: ////////////////// Load.java package org.bromon.reflect; import java.util.ArrayList; import java.util.List; public class Load implements Operator { @Override public List<?> act(List<?> params) { // TODO Auto-generated method stub List<

  • Java通过反射机制动态设置对象属性值的方法

    /** * MethodName: getReflection<br> * Description:解析respXML 在通过反射设置对象属性值 * User: liqijing * Date:2015-7-19下午12:42:55 * @param clzzName * @param respXML * @return * @throws ClassNotFoundException * @throws DocumentException * @throws IllegalArgumentE

  • 通过java反射机制动态调用某方法的总结(推荐)

    如下: public Object invokeMethod(String className, String methodName, Object[] args) throws Exception{ Class ownerClass = Class.forName(className); Object owner = ownerClass.newInstance(); Class[] argsClass = new Class[args.length]; for (int i = 0, j =

随机推荐