1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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{
        }
    }
 
}