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