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