conductor-oss/conductor · error · TransientException
Task %s of workflow %s can not be serialized to json
Error message
Task %s of workflow %s can not be serialized to json
What it means
Per-task analogue of error 364. While removing a workflow, each task is archived into the index; if objectMapper cannot serialize an individual task, this TransientException is thrown carrying the taskId and workflowId. As with the workflow-level case, index operations happen before DAO removal, so this failure aborts the deletion to preserve data.
Source
Thrown at core/src/main/java/com/netflix/conductor/core/dal/ExecutionDAOFacade.java:392
// Task index removals run before DAO deletion for the same consistency guarantees.
workflow.getTasks()
.forEach(
task -> {
try {
removeTaskIndex(workflow, task, archiveWorkflow);
} catch (NotFoundException e) {
if (archiveWorkflow) {
throw e;
}
// Idempotent deletion: missing index records should not block DAO
// removal.
LOGGER.info(
"Task {} of workflow {} not found in index during removal, continuing",
task.getTaskId(),
workflowId,
e);
} catch (JsonProcessingException e) {
throw new TransientException(
String.format(
"Task %s of workflow %s can not be serialized to json",
task.getTaskId(), workflow.getWorkflowId()),
e);
}
});
// Only remove from the source of truth after index operations succeed.
executionDAO.removeWorkflow(workflowId);
// finally remove from queues
workflow.getTasks()
.forEach(
task -> {
try {
queueDAO.remove(QueueUtils.getQueueName(task), task.getTaskId());
} catch (Exception e) {
LOGGER.info(View on GitHub (pinned to cf7c3e4a8a)
Solutions
- Inspect the failing task's input/output payload (taskId is in the message) for unserializable content.
- Register missing Jackson modules / serializers on the shared ObjectMapper.
- Fall back to remove with archiveWorkflow=false to delete the index entry instead of archiving, if preserving that task's raw JSON is not required.
- After fixing, retry the workflow removal; the DAO record remains intact.
Defensive patterns
Strategy: try-catch
Try / catch
try {
executionDAOFacade.removeWorkflow(workflowId, /* archive */ true);
} catch (TransientException e) {
// a task failed to serialize for archival; inspect the task id in the message
} Prevention
- Validate task input/output is serializable at task-creation time when possible.
- Avoid storing runtime/heap objects or circular references in task payloads.
- Keep Jackson modules consistent between write and archive paths.
When it happens
Trigger: A single TaskModel within a terminal workflow contains a payload Jackson cannot serialize (unserializable type, circular reference, missing serializer) when removeTaskIndex runs with archiveTask=true.
Common situations: One task stored a runtime object or oversized/unserializable input/output map. Version skew where TaskModel fields changed. Custom task types not registered with the mapper.
Related errors
- Workflow can not be serialized to json
- Error reading workflow: %s
- Error resetting workflow state: {}
- Error updating task: %s in workflow: %s
- Error creating %d tasks for workflow: %s
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/116ee4c2bfcfc558.
Report an issue: GitHub.