Search in sources :

Example 21 with StateInstruction

use of io.seata.saga.engine.pcext.StateInstruction in project seata by seata.

the class ChoiceStateHandler method process.

@Override
public void process(ProcessContext context) throws EngineExecutionException {
    StateInstruction instruction = context.getInstruction(StateInstruction.class);
    ChoiceStateImpl choiceState = (ChoiceStateImpl) instruction.getState(context);
    Map<Object, String> choiceEvaluators = choiceState.getChoiceEvaluators();
    if (choiceEvaluators == null) {
        synchronized (choiceState) {
            choiceEvaluators = choiceState.getChoiceEvaluators();
            if (choiceEvaluators == null) {
                List<ChoiceState.Choice> choices = choiceState.getChoices();
                if (choices == null) {
                    choiceEvaluators = new LinkedHashMap<>(0);
                } else {
                    choiceEvaluators = new LinkedHashMap<>(choices.size());
                    for (ChoiceState.Choice choice : choices) {
                        Evaluator evaluator = getEvaluatorFactory(context).createEvaluator(choice.getExpression());
                        choiceEvaluators.put(evaluator, choice.getNext());
                    }
                }
                choiceState.setChoiceEvaluators(choiceEvaluators);
            }
        }
    }
    Evaluator evaluator;
    for (Map.Entry<Object, String> entry : choiceEvaluators.entrySet()) {
        evaluator = (Evaluator) entry.getKey();
        if (evaluator.evaluate(context.getVariables())) {
            context.setVariable(DomainConstants.VAR_NAME_CURRENT_CHOICE, entry.getValue());
            return;
        }
    }
    if (StringUtils.isEmpty(choiceState.getDefault())) {
        StateMachineInstance stateMachineInstance = (StateMachineInstance) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_INST);
        EngineExecutionException exception = ExceptionUtils.createEngineExecutionException(FrameworkErrorCode.StateMachineNoChoiceMatched, "No choice matched, maybe it is a bug. Choice state name: " + choiceState.getName(), stateMachineInstance, null);
        EngineUtils.failStateMachine(context, exception);
        throw exception;
    }
    context.setVariable(DomainConstants.VAR_NAME_CURRENT_CHOICE, choiceState.getDefault());
}
Also used : StateInstruction(io.seata.saga.engine.pcext.StateInstruction) ChoiceStateImpl(io.seata.saga.statelang.domain.impl.ChoiceStateImpl) Evaluator(io.seata.saga.engine.evaluation.Evaluator) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) StateMachineInstance(io.seata.saga.statelang.domain.StateMachineInstance) ChoiceState(io.seata.saga.statelang.domain.ChoiceState) LinkedHashMap(java.util.LinkedHashMap) Map(java.util.Map)

Example 22 with StateInstruction

use of io.seata.saga.engine.pcext.StateInstruction in project seata by seata.

the class ScriptTaskHandlerInterceptor method postProcess.

@Override
public void postProcess(ProcessContext context, Exception exp) throws EngineExecutionException {
    StateInstruction instruction = context.getInstruction(StateInstruction.class);
    ScriptTaskStateImpl state = (ScriptTaskStateImpl) instruction.getState(context);
    StateMachineInstance stateMachineInstance = (StateMachineInstance) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_INST);
    StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);
    if (exp == null) {
        exp = (Exception) context.getVariable(DomainConstants.VAR_NAME_CURRENT_EXCEPTION);
    }
    Map<String, Object> contextVariables = (Map<String, Object>) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONTEXT);
    Object serviceOutputParams = context.getVariable(DomainConstants.VAR_NAME_OUTPUT_PARAMS);
    if (serviceOutputParams != null) {
        try {
            Map<String, Object> outputVariablesToContext = ParameterUtils.createOutputParams(stateMachineConfig.getExpressionFactoryManager(), state, serviceOutputParams);
            if (CollectionUtils.isNotEmpty(outputVariablesToContext)) {
                contextVariables.putAll(outputVariablesToContext);
            }
        } catch (Exception e) {
            String message = "Task [" + state.getName() + "] output parameters assign failed, please check 'Output' expression:" + e.getMessage();
            EngineExecutionException exception = ExceptionUtils.createEngineExecutionException(e, FrameworkErrorCode.VariablesAssignError, message, stateMachineInstance, state.getName());
            EngineUtils.failStateMachine(context, exception);
            throw exception;
        }
    }
    context.removeVariable(DomainConstants.VAR_NAME_OUTPUT_PARAMS);
    context.removeVariable(DomainConstants.VAR_NAME_INPUT_PARAMS);
    if (exp != null && context.getVariable(DomainConstants.VAR_NAME_IS_EXCEPTION_NOT_CATCH) != null && (Boolean) context.getVariable(DomainConstants.VAR_NAME_IS_EXCEPTION_NOT_CATCH)) {
        // If there is an exception and there is no catch, need to exit the state machine to execute.
        context.removeVariable(DomainConstants.VAR_NAME_IS_EXCEPTION_NOT_CATCH);
        EngineUtils.failStateMachine(context, exp);
    }
}
Also used : StateInstruction(io.seata.saga.engine.pcext.StateInstruction) ScriptTaskStateImpl(io.seata.saga.statelang.domain.impl.ScriptTaskStateImpl) StateMachineConfig(io.seata.saga.engine.StateMachineConfig) Map(java.util.Map) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) StateMachineInstance(io.seata.saga.statelang.domain.StateMachineInstance)

Example 23 with StateInstruction

use of io.seata.saga.engine.pcext.StateInstruction in project seata by seata.

the class ScriptTaskHandlerInterceptor method preProcess.

@Override
public void preProcess(ProcessContext context) throws EngineExecutionException {
    StateInstruction instruction = context.getInstruction(StateInstruction.class);
    StateMachineInstance stateMachineInstance = (StateMachineInstance) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_INST);
    StateMachineConfig stateMachineConfig = (StateMachineConfig) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONFIG);
    Map<String, Object> contextVariables = (Map<String, Object>) context.getVariable(DomainConstants.VAR_NAME_STATEMACHINE_CONTEXT);
    ScriptTaskStateImpl state = (ScriptTaskStateImpl) instruction.getState(context);
    List<Object> serviceInputParams = null;
    if (contextVariables != null) {
        try {
            serviceInputParams = ParameterUtils.createInputParams(stateMachineConfig.getExpressionFactoryManager(), null, state, contextVariables);
        } catch (Exception e) {
            String message = "Task [" + state.getName() + "] input parameters assign failed, please check 'Input' expression:" + e.getMessage();
            EngineExecutionException exception = ExceptionUtils.createEngineExecutionException(e, FrameworkErrorCode.VariablesAssignError, message, stateMachineInstance, state.getName());
            EngineUtils.failStateMachine(context, exception);
            throw exception;
        }
    }
    ((HierarchicalProcessContext) context).setVariableLocally(DomainConstants.VAR_NAME_INPUT_PARAMS, serviceInputParams);
}
Also used : StateInstruction(io.seata.saga.engine.pcext.StateInstruction) ScriptTaskStateImpl(io.seata.saga.statelang.domain.impl.ScriptTaskStateImpl) StateMachineConfig(io.seata.saga.engine.StateMachineConfig) HierarchicalProcessContext(io.seata.saga.proctrl.HierarchicalProcessContext) Map(java.util.Map) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) EngineExecutionException(io.seata.saga.engine.exception.EngineExecutionException) StateMachineInstance(io.seata.saga.statelang.domain.StateMachineInstance)

Aggregations

StateInstruction (io.seata.saga.engine.pcext.StateInstruction)23 EngineExecutionException (io.seata.saga.engine.exception.EngineExecutionException)15 StateMachineInstance (io.seata.saga.statelang.domain.StateMachineInstance)14 StateMachineConfig (io.seata.saga.engine.StateMachineConfig)11 StateInstance (io.seata.saga.statelang.domain.StateInstance)10 Map (java.util.Map)10 HierarchicalProcessContext (io.seata.saga.proctrl.HierarchicalProcessContext)7 AbstractTaskState (io.seata.saga.statelang.domain.impl.AbstractTaskState)5 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)5 ProcessContext (io.seata.saga.proctrl.ProcessContext)4 Loop (io.seata.saga.statelang.domain.TaskState.Loop)4 ServiceTaskStateImpl (io.seata.saga.statelang.domain.impl.ServiceTaskStateImpl)4 ArrayList (java.util.ArrayList)4 Date (java.util.Date)4 ForwardInvalidException (io.seata.saga.engine.exception.ForwardInvalidException)3 ProcessContextBuilder (io.seata.saga.engine.utils.ProcessContextBuilder)3 CompensateSubStateMachineState (io.seata.saga.statelang.domain.CompensateSubStateMachineState)3 ExecutionStatus (io.seata.saga.statelang.domain.ExecutionStatus)3 State (io.seata.saga.statelang.domain.State)3 StateMachine (io.seata.saga.statelang.domain.StateMachine)3