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 tasks = new ArrayList() ; 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(); } } }