| 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(); | 
|         } | 
|     } | 
|   | 
| } |