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