package com.dy.rtuMw.server.rtuData;
|
|
import java.util.ArrayList;
|
import java.util.List;
|
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
|
|
public class TaskPool {
|
|
private static Logger log = LogManager.getLogger(TaskPool.class.getName()) ;
|
|
private static List<TaskSurpport> tasks = new ArrayList<TaskSurpport>() ;
|
|
private static TreeConfig taskTreeConf ;
|
|
|
public static void setTaskTreeCofig(TreeConfig conf){
|
taskTreeConf = conf ;
|
}
|
|
|
/**
|
* 得到任务
|
* 多线程环境下运行
|
* @return
|
*/
|
public static TaskSurpport popTask(){
|
synchronized(tasks){
|
TaskSurpport t = (tasks.size() > 0)?tasks.get(0):null ;
|
if(t != null){
|
tasks.remove(0) ;
|
}else{
|
try {
|
t = newTaskTree() ;
|
} catch (Exception e) {
|
log.error(e.getMessage() == null?"实例化上行数据处理任务对象树失败!" : e.getMessage(), e);
|
} finally {
|
if(t == null){
|
log.error("实例化上行数据处理任务对象失败!" );
|
}
|
}
|
}
|
|
return t ;
|
}
|
}
|
|
/**
|
* 放回任务
|
* 多线程环境下运行
|
* 这里需要同步锁,因为上面方法中执行完tasks.get(0)且未执行tasks.remove(0)期间,本方法执行并且执行完,那么后期就会出乱子
|
* @param t
|
*/
|
public static void freeAndCleanTask(TaskSurpport t){
|
synchronized(tasks) {
|
if (t != null) {
|
boolean find = false;
|
for (TaskSurpport tin : tasks) {
|
if (tin == t) {
|
find = true;
|
break;
|
}
|
}
|
if (!find) {
|
t.cleanMeAndSubs();
|
tasks.add(0, t);
|
}
|
}
|
}
|
}
|
|
/**
|
* 实例化任务对象树
|
* @return
|
* @throws Exception
|
*/
|
private static TaskSurpport newTaskTree() throws Exception{
|
TaskSurpport t = null ;
|
if(taskTreeConf != null){
|
t = newTask(null, taskTreeConf.taskConf, taskTreeConf.subTreeConfs) ;
|
}
|
return t ;
|
}
|
|
private static TaskSurpport newTask(TaskSurpport root, TaskConfig taskConf, TreeConfig[] subTreeConfs) throws Exception{
|
TaskSurpport t = null ;
|
if(taskConf != null){
|
t = instanceTask(taskConf.clazz) ;
|
if(t != null){
|
t.conf = taskConf ;
|
t.root = root ;
|
if(root == null){
|
root = t ;
|
}
|
newSubTask(root, t, subTreeConfs);
|
}
|
}
|
return t ;
|
}
|
private static void newSubTask(TaskSurpport root, TaskSurpport parent, TreeConfig[] treeConfs)throws Exception{
|
if(parent != null && treeConfs != null && treeConfs.length > 0){
|
parent.subTasks = new TaskSurpport[treeConfs.length] ;
|
for(int i = 0 ; i < treeConfs.length; i++){
|
parent.subTasks[i] = newTask(root, treeConfs[i].taskConf, treeConfs[i].subTreeConfs) ;
|
}
|
}
|
}
|
private static TaskSurpport instanceTask(String clazz)throws Exception{
|
Class<?> c = Class.forName(clazz);
|
if (c == null) {
|
throw new Exception("实例化上行数据处理任务对象树失败!任务类为" + clazz + "!");
|
}else{
|
return (TaskSurpport)c.getDeclaredConstructor().newInstance();
|
//return (TaskSurpport)c.newInstance();
|
}
|
}
|
|
}
|