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

  1. Inspect the failing task's input/output payload (taskId is in the message) for unserializable content.
  2. Register missing Jackson modules / serializers on the shared ObjectMapper.
  3. 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.
  4. 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

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


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