conductor-oss/conductor · warning · ConflictException

${e.message}

Error message

${e.message}

What it means

Thrown by AgentService.resumeAgent when the underlying workflowService.resumeWorkflow throws an IllegalStateException, which is rethrown as a ConflictException. The conflict means the workflow is not in a state from which it can be resumed (e.g. it is not currently PAUSED, or it is already terminal). ConflictException maps to HTTP 409.

Solutions

  1. Check the execution status via getStatus() before calling resumeAgent — only resume if status is PAUSED.
  2. Handle HTTP 409 / ConflictException as a benign no-op if the agent is already running.
  3. Ensure pauseAgent was successfully called before attempting resume.

Example fix

// before
agentService.resumeAgent(executionId);

// after
AgentStatusResponse status = agentService.getStatus(executionId);
if ("PAUSED".equals(status.getStatus())) {
    agentService.resumeAgent(executionId);
} else {
    log.info("Skipping resume: execution {} is {}", executionId, status.getStatus());
}
Defensive patterns

Strategy: validation

Validate before calling

AgentStatusResponse status = agentService.getStatus(executionId);
if (!"PAUSED".equals(status.getStatus())) {
    throw new IllegalStateException(
        "Cannot resume: execution is " + status.getStatus());
}
agentService.resumeAgent(executionId);

Try / catch

try {
    agentService.resumeAgent(executionId);
} catch (ConflictException e) {
    // Not in a pausable state — benign if already running
    log.info("Cannot resume {}: {}", executionId, e.getMessage());
}

Prevention

When it happens

Trigger: Calling resumeAgent on an execution that is RUNNING (never paused); calling resume on a COMPLETED/FAILED/TERMINATED execution; double-resume where the workflow was already resumed by another caller.

Common situations: UI shows a stale status and the user clicks resume on an already-running or already-completed agent; orchestration logic calls resume unconditionally without checking pause state; race condition where two concurrent resume calls land.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/0b9545c98ca74b9a. Report an issue: GitHub.

Appendix: source

Thrown at agentspan/src/main/java/org/conductoross/conductor/ai/agentspan/runtime/service/AgentService.java:567

                .version(workflow.getWorkflowVersion())
                .status(workflow.getStatus().name())
                .input(workflow.getInput())
                .output(workflow.getOutput())
                .currentTask(currentTask)
                .build();
    }

    /** Pause a running agent execution. */
    public void pauseAgent(String executionId) {
        workflowService.pauseWorkflow(executionId);
    }

    /** Resume a paused agent execution. */
    public void resumeAgent(String executionId) {
        try {
            workflowService.resumeWorkflow(executionId);
        } catch (IllegalStateException e) {
            throw new ConflictException(e.getMessage());
        }
    }

    /** Cancel a running agent execution. */
    public void cancelAgent(String executionId, String reason) {
        workflowService.terminateWorkflow(
                executionId, reason != null ? reason : "Cancelled by user");
    }

    /**
     * Permanently delete an execution record from the database.
     *
     * <p>Wraps Conductor's {@code WorkflowService.deleteWorkflow} to hard-delete completed
     * execution records. Running executions should be terminated first.
     *
     * @param executionId the execution to remove
     * @param archiveTasks if true, archive task records instead of deleting them
     */

View on GitHub (pinned to cf7c3e4a8a)