| New file | 
 |  |  | 
 |  |  | package com.dy.rtuMw.server.rtuData; | 
 |  |  |  | 
 |  |  | import org.apache.logging.log4j.LogManager; | 
 |  |  | import org.apache.logging.log4j.Logger; | 
 |  |  |  | 
 |  |  | import java.text.ParseException; | 
 |  |  |  | 
 |  |  | /** | 
 |  |  |  * 部分实现Task | 
 |  |  |  */ | 
 |  |  | public abstract class TaskSurpport implements Task { | 
 |  |  |  | 
 |  |  |    private static final Logger log = LogManager.getLogger(TaskSurpport.class.getName()) ; | 
 |  |  | 	 | 
 |  |  |    //当前所处理的上行数据所属RTU的地址 | 
 |  |  |    //public String rtuAddr_inRootTk ;//只在根root任务对象上会付此值 | 
 |  |  |    //本节点配置 | 
 |  |  |    protected TaskConfig conf ; | 
 |  |  |    //根任务 | 
 |  |  |    protected TaskSurpport root ; | 
 |  |  |    //本任务的子任务 | 
 |  |  |    protected TaskSurpport[] subTasks ; | 
 |  |  |    //本任务的处理结果 | 
 |  |  |    protected Object[] taskResult ; | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 执行节点任务 | 
 |  |  |     * @param data 需要处理的数据 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public abstract void execute(Object data) throws ParseException; | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 任务采用对象池,以便重用任务对象, | 
 |  |  |     * 重用前要进行对象初始化,清除上次执行任务时遗留的对象属性数据 | 
 |  |  |     * 初始化本任务及所有子任务 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public void cleanMeAndSubs() { | 
 |  |  |       //rtuAddr_inRootTk = null ; | 
 |  |  |       taskResult = null ; | 
 |  |  |       if(this.subTasks != null && this.subTasks.length > 0){ | 
 |  |  |          for(int i = 0 ; i < this.subTasks.length; i++){ | 
 |  |  |             this.subTasks[i].cleanMeAndSubs() ; | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 得到本任务节点处理产生的中间结果,以供本节点所在树枝的下级任务节点及本树枝的左侧(根在上)所有树枝的节点应用本结果 | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public Object[] getMyResults(){ | 
 |  |  |       return taskResult ; | 
 |  |  |    } | 
 |  |  | 	 | 
 |  |  |    /** | 
 |  |  |     * 得到指定任务节点处理产生的中间结果,以供本节点所在树枝的下级任务节点及本树枝的左侧(根在上)所有树枝的节点应用本结果 | 
 |  |  |     * @param id 指定任务ID | 
 |  |  |     * @return | 
 |  |  |     */ | 
 |  |  |    public Object[] getTaskResults(String id){ | 
 |  |  |       if(root != null){ | 
 |  |  |          return this.getTaskResults(root, id) ; | 
 |  |  |       } | 
 |  |  |       return null ; | 
 |  |  |    } | 
 |  |  |    private Object[] getTaskResults(TaskSurpport task, String id){  | 
 |  |  |       if(task != null && task.conf != null && task.conf.id != null && task.conf.id.equals(id)){ | 
 |  |  |          return task.getMyResults() ; | 
 |  |  |       }else{ | 
 |  |  |          if(task.subTasks != null && task.subTasks.length > 0){ | 
 |  |  |             Object[] rs = null ; | 
 |  |  |             for(int i = 0 ; i < task.subTasks.length; i++){ | 
 |  |  |                rs = getTaskResults(task.subTasks[i], id) ; | 
 |  |  |                if(rs != null){ | 
 |  |  |                   return rs ; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } | 
 |  |  |       return null ; | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 转下级任务节点处理,首先要实体化所有子节点。 | 
 |  |  |     * @param data 需要处理的数据 | 
 |  |  |     */ | 
 |  |  |    @Override | 
 |  |  |    public void toNextTasks(Object data) { | 
 |  |  |       try { | 
 |  |  |          if(subTasks != null && subTasks.length > 0){ | 
 |  |  |             for(int i = 0 ; i < subTasks.length ; i++){ | 
 |  |  |                if(subTasks[i].conf.enable){ | 
 |  |  |                   subTasks[i].execute(data) ; | 
 |  |  |                }else{ | 
 |  |  |                   //本节点不起作用,直接进入本节的子节点 | 
 |  |  |                   subTasks[i].toNextTasks(data) ; | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } catch (Exception e) { | 
 |  |  |          log.error("向下级任务传递工作时出错," , e); | 
 |  |  |       }finally{ | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |  | 
 |  |  |    /** | 
 |  |  |     * 转下级某个任务节点处理  | 
 |  |  |     * @param data 需要处理的数据 | 
 |  |  |     * @param id 指定任务ID | 
 |  |  |     */ | 
 |  |  |    public void toNextOneTask(Object data, String id){ | 
 |  |  |       try { | 
 |  |  |          if(subTasks != null && subTasks.length > 0){ | 
 |  |  |             for(int i = 0 ; i < subTasks.length ; i++){ | 
 |  |  |                if(subTasks[i].conf.id.equals(id)){ | 
 |  |  |                   if(subTasks[i].conf.enable){ | 
 |  |  |                      subTasks[i].execute(data) ; | 
 |  |  |                   }else{ | 
 |  |  |                      //本节点不起作用,直接进入本节的子节点 | 
 |  |  |                      subTasks[i].toNextTasks(data) ; | 
 |  |  |                   } | 
 |  |  |                } | 
 |  |  |             } | 
 |  |  |          } | 
 |  |  |       } catch (Exception e) { | 
 |  |  |          log.error("向指定子任务(" + id + ")传递任务时出错," , e); | 
 |  |  |       }finally{ | 
 |  |  |       } | 
 |  |  |    } | 
 |  |  |  | 
 |  |  | } |