public void process()

in saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/pcext/handlers/SubStateMachineHandler.java [71:142]


    public void process(ProcessContext context) throws EngineExecutionException {

        StateInstruction instruction = context.getInstruction(StateInstruction.class);
        SubStateMachineImpl subStateMachine = (SubStateMachineImpl)instruction.getState(context);

        StateMachineEngine engine = (StateMachineEngine)context.getVariable(
            DomainConstants.VAR_NAME_STATEMACHINE_ENGINE);
        StateMachineInstance stateMachineInstance = (StateMachineInstance)context.getVariable(
            DomainConstants.VAR_NAME_STATEMACHINE_INST);
        StateInstance stateInstance = (StateInstance)context.getVariable(DomainConstants.VAR_NAME_STATE_INST);

        Object inputParamsObj = context.getVariable(DomainConstants.VAR_NAME_INPUT_PARAMS);
        Map<String, Object> startParams = new HashMap<>(0);
        if (inputParamsObj instanceof List) {
            List<Object> listInputParams = (List<Object>)inputParamsObj;
            if (listInputParams.size() > 0) {
                startParams = (Map<String, Object>)listInputParams.get(0);
            }
        } else if (inputParamsObj instanceof Map) {
            startParams = (Map<String, Object>)inputParamsObj;
        }

        startParams.put(DomainConstants.VAR_NAME_PARENT_ID, EngineUtils.generateParentId(stateInstance));
        try {
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug(">>>>>>>>>>>>>>>>>>>>>> Start to execute SubStateMachine [{}] by state[{}]",
                    subStateMachine.getStateMachineName(), subStateMachine.getName());
            }
            StateMachineInstance subStateMachineInstance = callSubStateMachine(startParams, engine, context,
                stateInstance, subStateMachine);

            Map<String, Object> outputParams = subStateMachineInstance.getEndParams();
            boolean isForward = DomainConstants.OPERATION_NAME_FORWARD.equals(
                context.getVariable(DomainConstants.VAR_NAME_OPERATION_NAME));
            ExecutionStatus callSubMachineStatus = decideStatus(subStateMachineInstance, isForward);
            stateInstance.setStatus(callSubMachineStatus);
            outputParams.put(DomainConstants.VAR_NAME_SUB_STATEMACHINE_EXEC_STATUE, callSubMachineStatus.toString());
            context.setVariable(DomainConstants.VAR_NAME_OUTPUT_PARAMS, outputParams);
            stateInstance.setOutputParams(outputParams);

            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug(
                    "<<<<<<<<<<<<<<<<<<<<<< SubStateMachine[{}] execute finish with status[{}], compensateStatus[{}]",
                    subStateMachine.getStateMachineName(), subStateMachineInstance.getStatus(),
                    subStateMachineInstance.getCompensationStatus());
            }

        } catch (Exception e) {

            LOGGER.error("SubStateMachine[{}] execute failed by state[name:{}]", subStateMachine.getStateMachineName(),
                subStateMachine.getName(), e);

            if (e instanceof ForwardInvalidException) {

                String retriedId = stateInstance.getStateIdRetriedFor();
                StateInstance stateToBeRetried = null;
                for (StateInstance stateInst : stateMachineInstance.getStateList()) {
                    if (retriedId.equals(stateInst.getId())) {
                        stateToBeRetried = stateInst;
                        break;
                    }
                }
                if (stateToBeRetried != null) {
                    stateInstance.setStatus(stateToBeRetried.getStatus());
                }
            }

            context.setVariable(DomainConstants.VAR_NAME_CURRENT_EXCEPTION, e);

            EngineUtils.handleException(context, subStateMachine, e);
        }
    }