zhubaomin
2025-04-07 1a2b07f01ba4616fd9e894dddf474b56d020158c
pipIrr-platform/pipIrr-mw/pipIrr-mw-rtu/src/main/java/com/dy/rtuMw/server/rtuData/TaskPool.java
New file
@@ -0,0 +1,132 @@
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 Integer taskTotal = 0 ;
   private static TreeConfig taskTreeConf ;
   public static void setTaskTreeCofig(TreeConfig conf){
      taskTreeConf = conf ;
   }
   /**
    * 得到任务树实例总数
    * @return
    */
   public static Integer totalTasks() {
      return taskTotal ;
   }
   /**
    * 得到任务
    * 多线程环境下运行
    * @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("实例化上行数据处理任务对象失败!" );
               }else{
                  taskTotal++ ;
               }
            }
         }
         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();
      }
   }
}