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.

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)

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.