flowable/flowable-engine · error · FlowableIllegalArgumentException
There is no batch part with the id
Error message
There is no batch part with the id ${configuration} What it means
DeleteHistoricProcessInstanceIdsJobHandler.execute looks up a BatchPart by the job's configuration id via batchService.getBatchPart(configuration). If no batch part exists with that id it throws FlowableIllegalArgumentException. The job is then orphaned: it references a batch-part row that is gone.
Solutions
- Verify the batch part id exists (ACT_RU_BATCH_PART) and re-create the batch part if it was lost.
- Delete the orphaned job whose configuration points at the missing batch part.
- Cancel/recreate the whole batch through the BatchService instead of manual table manipulation.
Example fix
// before // manual row deletion DELETE FROM ACT_RU_BATCH_PART WHERE ID_ = 'partId'; // after batchService.deleteBatchPartById(partId); // cleans related jobs consistently
Defensive patterns
Strategy: validation
Validate before calling
BatchPart part = batchService.getBatchPart(partId);
if (part == null) {
// part missing; remove the orphaned job or recreate the batch part
} Try / catch
try {
// execute job handler
} catch (FlowableIllegalArgumentException e) {
if (e.getMessage().startsWith("There is no batch part with the id")) {
// mark job as done/dead, do not retry
} else {
throw e;
}
} Prevention
- Use BatchService APIs to delete batch parts so dependent jobs are cleaned up.
- Audit runtime tables after purge/migration scripts for orphaned batch part jobs.
When it happens
Trigger: A delete-historic-process-instance-ids batch part job executes with a configuration (batch part id) that batchService.getBatchPart cannot resolve — the ACT_RU_BATCH_PART row was deleted or never committed.
Common situations: Direct SQL cleanup of batch part rows; transaction rollback after batch part creation while jobs persisted; purge/migration scripts that removed batch parts but kept jobs.
Understand the failure class
Background: Record Not Found Errors: "not found", RecordNotFound, and "was not found" — what they mean and how to fix them — this error's family across 28 libraries.
Related errors
- There is no batch with the id
- There is no batch with the id
- Batch part with id ' ' does not have a batch part document.
- Cannot find bpmn model for process definition id
- Cannot find plan item with definition id
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/3eb67d57b6f8db1d.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-engine/src/main/java/org/flowable/engine/impl/delete/DeleteHistoricProcessInstanceIdsJobHandler.java:59
* @author Filip Hrisafov
*/
public class DeleteHistoricProcessInstanceIdsJobHandler implements JobHandler {
public static final String TYPE = "delete-historic-process-ids";
@Override
public String getType() {
return TYPE;
}
@Override
public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {
ProcessEngineConfigurationImpl engineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);
BatchService batchService = engineConfiguration.getBatchServiceConfiguration().getBatchService();
BatchPart batchPart = batchService.getBatchPart(configuration);
if (batchPart == null) {
throw new FlowableIllegalArgumentException("There is no batch part with the id " + configuration);
}
Batch batch = batchService.getBatch(batchPart.getBatchId());
if (DeleteProcessInstanceBatchConstants.STATUS_STOPPED.equals(batch.getStatus())) {
batchService.completeBatchPart(batchPart.getId(), DeleteProcessInstanceBatchConstants.STATUS_STOPPED, null);
return;
}
ManagementService managementService = engineConfiguration.getManagementService();
BatchPart computeBatchPart = managementService.createBatchPartQuery()
.id(batchPart.getSearchKey())
.singleResult();
JsonNode computeBatchPartResult = getBatchPartResult(computeBatchPart, engineConfiguration);
JsonNode idsToDelete = computeBatchPartResult.path("processInstanceIdsToDelete");
Set<String> processInstanceIdsToDelete = new HashSet<>();
View on GitHub (pinned to d6d39ce1c6)