| New file | 
 |  |  | 
 |  |  | package com.dy.rtuMw.server.rtuData; | 
 |  |  |  | 
 |  |  | import java.util.ArrayList; | 
 |  |  | import java.util.List; | 
 |  |  |  | 
 |  |  | import org.apache.logging.log4j.LogManager; | 
 |  |  | import org.apache.logging.log4j.Logger; | 
 |  |  |  | 
 |  |  |  | 
 |  |  | public class TaskPool { | 
 |  |  |  | 
 |  |  |    private static Logger log = LogManager.getLogger(TaskPool.class.getName()) ; | 
 |  |  | 	 | 
 |  |  |    private static List<TaskSurpport> tasks = new ArrayList<TaskSurpport>() ; | 
 |  |  |  | 
 |  |  |    private static Integer taskTotal = 0 ; | 
 |  |  | 	 | 
 |  |  |    private static TreeConfig taskTreeConf ; | 
 |  |  | 	 | 
 |  |  | 	 | 
 |  |  |    public static void setTaskTreeCofig(TreeConfig conf){ | 
 |  |  |       taskTreeConf = conf ; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 得到任务树实例总数 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    public static Integer totalTasks() { | 
 |  |  |       return taskTotal ; | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 得到任务 | 
 |  |  |     * 多线程环境下运行 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    public static TaskSurpport popTask(){ | 
 |  |  |       synchronized(tasks){ | 
 |  |  |          TaskSurpport t = (tasks.size() > 0)?tasks.get(0):null ; | 
 |  |  |          if(t != null){ | 
 |  |  |             tasks.remove(0) ; | 
 |  |  |          }else{ | 
 |  |  |             try { | 
 |  |  |                t = newTaskTree() ; | 
 |  |  |             } catch (Exception e) { | 
 |  |  |                log.error(e.getMessage() == null?"实例化上行数据处理任务对象树失败!" : e.getMessage(), e); | 
 |  |  |             } finally { | 
 |  |  |                if(t == null){ | 
 |  |  |                   log.error("实例化上行数据处理任务对象失败!" ); | 
 |  |  |                }else{ | 
 |  |  |                   taskTotal++ ; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |  | 
 |  |  |          return t ; | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 放回任务 | 
 |  |  |     * 多线程环境下运行 | 
 |  |  |     * 这里需要同步锁,因为上面方法中执行完tasks.get(0)且未执行tasks.remove(0)期间,本方法执行并且执行完,那么后期就会出乱子 | 
 |  |  |     * @param t | 
 |  |  |     */ | 
 |  |  |    public static void freeAndCleanTask(TaskSurpport t){ | 
 |  |  |       synchronized(tasks) { | 
 |  |  |          if (t != null) { | 
 |  |  |             boolean find = false; | 
 |  |  |             for (TaskSurpport tin : tasks) { | 
 |  |  |                if (tin == t) { | 
 |  |  |                   find = true; | 
 |  |  |                   break; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |             if (!find) { | 
 |  |  |                t.cleanMeAndSubs(); | 
 |  |  |                tasks.add(0, t); | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 实例化任务对象树 | 
 |  |  |     * @return | 
 |  |  |     * @throws Exception | 
 |  |  |     */ | 
 |  |  |    private static TaskSurpport newTaskTree() throws Exception{ | 
 |  |  |       TaskSurpport t = null ; | 
 |  |  |       if(taskTreeConf != null){ | 
 |  |  |          t = newTask(null, taskTreeConf.taskConf, taskTreeConf.subTreeConfs) ; | 
 |  |  |       } | 
 |  |  |       return t ; | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    private static TaskSurpport newTask(TaskSurpport root, TaskConfig taskConf, TreeConfig[] subTreeConfs) throws Exception{ | 
 |  |  |       TaskSurpport t = null ; | 
 |  |  |       if(taskConf != null){ | 
 |  |  |          t = instanceTask(taskConf.clazz) ; | 
 |  |  |          if(t != null){ | 
 |  |  |             t.conf = taskConf ; | 
 |  |  |             t.root = root ; | 
 |  |  |             if(root == null){ | 
 |  |  |                root = t ; | 
 |  |  |             } | 
 |  |  |             newSubTask(root, t, subTreeConfs); | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       return t ; | 
 |  |  |    } | 
 |  |  |    private static void newSubTask(TaskSurpport root, TaskSurpport parent, TreeConfig[] treeConfs)throws Exception{ | 
 |  |  |       if(parent != null && treeConfs != null && treeConfs.length > 0){ | 
 |  |  |          parent.subTasks = new TaskSurpport[treeConfs.length] ; | 
 |  |  |          for(int i = 0 ; i < treeConfs.length; i++){ | 
 |  |  |             parent.subTasks[i] = newTask(root, treeConfs[i].taskConf, treeConfs[i].subTreeConfs) ; | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |    private static TaskSurpport instanceTask(String clazz)throws Exception{ | 
 |  |  |       Class<?> c = Class.forName(clazz); | 
 |  |  |       if (c == null) { | 
 |  |  |          throw new Exception("实例化上行数据处理任务对象树失败!任务类为" + clazz + "!"); | 
 |  |  |       }else{ | 
 |  |  |          return (TaskSurpport)c.getDeclaredConstructor().newInstance(); | 
 |  |  |          //return (TaskSurpport)c.newInstance(); | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | } |