Search in sources :

Example 1 with RespondDecisionTaskFailedRequest

use of com.uber.cadence.RespondDecisionTaskFailedRequest in project cadence-client by uber-java.

the class TestWorkflowMutableStateImpl method completeDecisionTask.

@Override
public void completeDecisionTask(int historySize, RespondDecisionTaskCompletedRequest request) throws InternalServiceError, EntityNotExistsError, BadRequestError {
    List<Decision> decisions = request.getDecisions();
    completeDecisionUpdate(ctx -> {
        if (ctx.getInitialEventId() != historySize) {
            throw new BadRequestError("Expired decision: expectedHistorySize=" + historySize + "," + " actualHistorySize=" + ctx.getInitialEventId());
        }
        long decisionTaskCompletedId = ctx.getNextEventId() - 1;
        // workflow
        if (!concurrentToDecision.isEmpty() && hasCompleteDecision(request.getDecisions())) {
            RespondDecisionTaskFailedRequest failedRequest = new RespondDecisionTaskFailedRequest().setCause(DecisionTaskFailedCause.UNHANDLED_DECISION).setIdentity(request.getIdentity());
            decision.action(Action.FAIL, ctx, failedRequest, decisionTaskCompletedId);
            for (RequestContext deferredCtx : this.concurrentToDecision) {
                ctx.add(deferredCtx);
            }
            this.concurrentToDecision.clear();
            scheduleDecision(ctx);
            return;
        }
        if (decision == null) {
            throw new EntityNotExistsError("No outstanding decision");
        }
        decision.action(StateMachines.Action.COMPLETE, ctx, request, 0);
        for (Decision d : decisions) {
            processDecision(ctx, d, request.getIdentity(), decisionTaskCompletedId);
        }
        for (RequestContext deferredCtx : this.concurrentToDecision) {
            ctx.add(deferredCtx);
        }
        this.decision = null;
        boolean completed = workflow.getState() == StateMachines.State.COMPLETED || workflow.getState() == StateMachines.State.FAILED || workflow.getState() == StateMachines.State.CANCELED;
        if (!completed && (ctx.isNeedDecision() || !this.concurrentToDecision.isEmpty())) {
            scheduleDecision(ctx);
        }
        this.concurrentToDecision.clear();
        ctx.unlockTimer();
    });
    lock.lock();
    try {
        {
            if (decision != null && decision.getState() != StateMachines.State.INITIATED) {
                throw new InternalServiceError("non null decision after the completion: " + decision.getState());
            }
        }
    } finally {
        lock.unlock();
    }
}
Also used : RespondDecisionTaskFailedRequest(com.uber.cadence.RespondDecisionTaskFailedRequest) InternalServiceError(com.uber.cadence.InternalServiceError) EntityNotExistsError(com.uber.cadence.EntityNotExistsError) BadRequestError(com.uber.cadence.BadRequestError) Decision(com.uber.cadence.Decision)

Aggregations

BadRequestError (com.uber.cadence.BadRequestError)1 Decision (com.uber.cadence.Decision)1 EntityNotExistsError (com.uber.cadence.EntityNotExistsError)1 InternalServiceError (com.uber.cadence.InternalServiceError)1 RespondDecisionTaskFailedRequest (com.uber.cadence.RespondDecisionTaskFailedRequest)1