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