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