docs: public void execute(DelegateExecution execution) {
      boolean isSkipExpressionEnabled = SkipExpressionUtil.isSkipExpressionEnabled(execution, skipExpression);
      if (!isSkipExpressionEnabled || (isSkipExpressionEnabled && !SkipExpressionUtil.shouldSkipFlowElement(execution, skipExpression))) {
  
        if (Context.getProcessEngineConfiguration().isEnableProcessDefinitionInfoCache()) {
          ObjectNode taskElementProperties = Context.getBpmnOverrideElementProperties(serviceTaskId, execution.getProcessDefinitionId());
          if (taskElementProperties != null && taskElementProperties.has(DynamicBpmnConstants.SERVICE_TASK_CLASS_NAME)) {
            String overrideClassName = taskElementProperties.get(DynamicBpmnConstants.SERVICE_TASK_CLASS_NAME).asText();
            if (StringUtils.isNotEmpty(overrideClassName) && !overrideClassName.equals(className)) {
              className = overrideClassName;
              activityBehaviorInstance = null;
            }
          }
        }
        
        if (activityBehaviorInstance == null) {
          activityBehaviorInstance = getActivityBehaviorInstance();
        }
  
        try {
          activityBehaviorInstance.execute(execution);
        } catch (BpmnError error) {
          ErrorPropagation.propagateError(error, execution);
        } catch (RuntimeException e) {
          if (!ErrorPropagation.mapException(e, (ExecutionEntity) execution, mapExceptions))
            throw e;
        }
      }
    }