@Override
  public Void execute(CommandContext commandContext) {
    if (currentTaskEntity != null) {

      ExecutionEntity execution =
          commandContext
              .getExecutionEntityManager()
              .findExecutionById(currentTaskEntity.getExecutionId());
      execution.setActivity(activity);
      execution.performOperation(AtomicOperation.TRANSITION_CREATE_SCOPE);

      if (variables != null) {
        if (currentTaskEntity.getExecutionId() != null) {
          currentTaskEntity.setExecutionVariables(variables);
        } else {
          currentTaskEntity.setVariables(variables);
        }
      }
      // 删除当前的任务,不能删除当前正在执行的任务,所以要先清除掉关联
      Context.getCommandContext()
          .getTaskEntityManager()
          .deleteTask(currentTaskEntity, TaskEntity.DELETE_REASON_DELETED, false);
    }
    return null;
  }
  public List<ProcessInstance> executeList(CommandContext commandContext, Page page) {
    checkQueryOk();
    ensureVariablesInitialized();
    List<ProcessInstance> processInstances = null;
    if (includeProcessVariables) {
      processInstances =
          commandContext
              .getExecutionEntityManager()
              .findProcessInstanceAndVariablesByQueryCriteria(this);
    } else {
      processInstances =
          commandContext.getExecutionEntityManager().findProcessInstanceByQueryCriteria(this);
    }

    for (ProcessInstance processInstance : processInstances) {
      localize(processInstance);
    }

    return processInstances;
  }
  public void handleEvent(
      EventSubscriptionEntity eventSubscription, Object payload, CommandContext commandContext) {

    String configuration = eventSubscription.getConfiguration();
    if (configuration == null) {
      throw new ActivitiException(
          "Compensating execution not set for compensate event subscription with id "
              + eventSubscription.getId());
    }

    ExecutionEntity compensatingExecution =
        commandContext.getExecutionEntityManager().findExecutionById(configuration);

    ActivityImpl compensationHandler = eventSubscription.getActivity();

    if ((compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION) == null
            || !(Boolean)
                compensationHandler.getProperty(BpmnParse.PROPERTYNAME_IS_FOR_COMPENSATION))
        && compensationHandler.isScope()) {

      // descend into scope:
      List<CompensateEventSubscriptionEntity> eventsForThisScope =
          compensatingExecution.getCompensateEventSubscriptions();
      ScopeUtil.throwCompensationEvent(eventsForThisScope, compensatingExecution, false);

    } else {
      try {

        if (commandContext.getProcessEngineConfiguration().getEventDispatcher().isEnabled()) {
          commandContext
              .getProcessEngineConfiguration()
              .getEventDispatcher()
              .dispatchEvent(
                  ActivitiEventBuilder.createActivityEvent(
                      ActivitiEventType.ACTIVITY_COMPENSATE,
                      compensationHandler.getId(),
                      compensatingExecution.getId(),
                      compensatingExecution.getProcessInstanceId(),
                      compensatingExecution.getProcessDefinitionId()));
        }
        compensatingExecution.setActivity(compensationHandler);

        // executing the atomic operation makes sure activity start events are fired
        compensatingExecution.performOperation(AtomicOperation.ACTIVITY_START);

      } catch (Exception e) {
        throw new ActivitiException(
            "Error while handling compensation event " + eventSubscription, e);
      }
    }
  }
 public long executeCount(CommandContext commandContext) {
   checkQueryOk();
   ensureVariablesInitialized();
   return commandContext.getExecutionEntityManager().findProcessInstanceCountByQueryCriteria(this);
 }