@Override
 public IApprovalProcess checkProcess(IApprovalData data) {
   if (data == null) {
     return null;
   }
   if (!data.isNew()) {
     // 不是新建查看是否存在审批
     IApprovalProcess aProcess = this.loadApprovalProcess(data.getIdentifiers());
     if (aProcess != null) {
       return aProcess;
     }
   }
   // 创建审批流程并尝试开始
   if (this.checkDataStatus(data)) {
     Iterator<IApprovalProcess> process = this.createApprovalProcess(data.getObjectCode());
     while (process != null && process.hasNext()) {
       IApprovalProcess aProcess = process.next();
       if (aProcess.start(data)) {
         RuntimeLog.log(RuntimeLog.MSG_APPROVAL_PROCESS_STARTED, data, aProcess.getName());
         return aProcess; // 审批流程开始
       }
     }
   }
   return null;
 }
 @Override
 public long add(IDaemonTask task) throws InvalidDaemonTask {
   if (task != null && task.getName() != null && !task.getName().isEmpty()) {
     synchronized (this.getWrappings()) {
       DaemonTaskWrapping wrapping = new DaemonTaskWrapping(task);
       wrapping.setId(Math.abs(UUID.randomUUID().getLeastSignificantBits()));
       this.getWrappings().add(wrapping);
       RuntimeLog.log(RuntimeLog.MSG_DAEMON_REGISTER_TASK, wrapping.getId(), wrapping.getName());
       return wrapping.getId();
     }
   } else {
     throw new InvalidDaemonTask();
   }
 }
 @Override
 public boolean remove(long taskId) {
   if (taskId < 0) {
     return false;
   }
   synchronized (this.getWrappings()) {
     for (int i = this.getWrappings().size() - 1; i >= 0; i--) {
       DaemonTaskWrapping wrapping = this.getWrappings().get(i);
       if (wrapping == null) {
         continue;
       }
       if (wrapping.getId() == taskId) {
         this.getWrappings().remove(i);
       }
       RuntimeLog.log(RuntimeLog.MSG_DAEMON_REMOVE_TASK, wrapping.getId(), wrapping.getName());
     }
   }
   return false;
 }
  @Override
  public void checkRun() {
    long time = System.currentTimeMillis();
    for (DaemonTaskWrapping wrapping : this.getWrappings()) {
      if (wrapping == null) {
        continue;
      }
      if (wrapping.isRunning()) {
        // 同时仅启动一个任务
        continue;
      }
      if (!wrapping.isActivated()) {
        continue;
      }
      boolean done = wrapping.tryRun(time);
      if (done) {
        // 可以运行
        RuntimeLog.log(
            MessageLevel.DEBUG,
            RuntimeLog.MSG_DAEMON_RUN_TASK,
            wrapping.getId(),
            wrapping.getName(),
            wrapping.getRunTimes());
        // 从线程池中调用新的线程运行此任务
        this.getThreadPool()
            .execute(
                new Runnable() {

                  @Override
                  public void run() {
                    wrapping.run();
                  }
                });
      }
    }
  }