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{ } } }