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
- Check the execution status via getStatus() before calling resumeAgent — only resume if status is PAUSED.
- Handle HTTP 409 / ConflictException as a benign no-op if the agent is already running.
- 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
- Check status is PAUSED before calling resumeAgent.
- Treat HTTP 409 on resume as a benign no-op.
- Ensure pauseAgent completed before attempting resume.
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
- Workflow is in terminal state. Status = %s
- Workflow: %s is not in terminal state, unable to restart.
- No agent execution found: ${executionId}
- No pending HUMAN task found in execution {executionId}
- Workflow: %s, version: %s already exists!
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/0b9545c98ca74b9a.
Report an issue: GitHub.