flowable/flowable-engine · error · FlowableIllegalArgumentException
The config is null
Error message
The config is null
What it means
Null check in CmmnManagementServiceImpl.executeCommand(CommandConfig, Command): a null CommandConfig (the txfactory/retry/timeout config) is rejected before execution. The config decides how the command runs (transaction handling), so it is required.
Source
Thrown at modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/CmmnManagementServiceImpl.java:352
public void unacquireAllExternalWorkerJobsForWorker(String workerId, String tenantId) {
commandExecutor.execute(new UnacquireAllExternalWorkerJobsForWorkerCmd(workerId, tenantId, configuration.getJobServiceConfiguration()));
}
@Override
public ChangeTenantIdBuilder createChangeTenantIdBuilder(String fromTenantId, String toTenantId) {
return new ChangeTenantIdBuilderImpl(fromTenantId, toTenantId, configuration.getChangeTenantIdManager());
}
public <T> T executeCommand(Command<T> command) {
if (command == null) {
throw new FlowableIllegalArgumentException("The command is null");
}
return commandExecutor.execute(command);
}
public <T> T executeCommand(CommandConfig config, Command<T> command) {
if (config == null) {
throw new FlowableIllegalArgumentException("The config is null");
}
if (command == null) {
throw new FlowableIllegalArgumentException("The command is null");
}
return commandExecutor.execute(config, command);
}
@Override
public LockManager getLockManager(String lockName) {
return new LockManagerImpl(commandExecutor, lockName, getConfiguration().getLockPollRate(), configuration.getEngineCfgKey());
}
}
View on GitHub (pinned to d6d39ce1c6)
Solutions
- Use a valid config, e.g. commandExecutor's defaultConfig or new StandaloneTaskCommandConfig() / appropriate CommandConfig
- Guard the config lookup: fall back to a default when the resolved config is null
- Check initialization order so the config field is set before first use
Example fix
// before cmmnManagementService.executeCommand(cfg, cmd); // cfg may be null // after CommandConfig cfg = resolveConfigOrDefault(); cmmnManagementService.executeCommand(cfg != null ? cfg : new CommandConfig(), cmd);
Defensive patterns
Strategy: validation
Validate before calling
CommandConfig cfg = resolveConfig(); if (cfg == null) cfg = new CommandConfig();
Try / catch
try { managementService.executeCommand(cfg, cmd); } catch (FlowableIllegalArgumentException e) { /* null config */ } Prevention
- Initialize CommandConfig fields eagerly at bootstrap
- Default to a standard CommandConfig when lookup fails
- Don't confuse the one-arg and two-arg executeCommand overloads
When it happens
Trigger: Calling cmmnManagementService.executeCommand(null, someCommand).
Common situations: Caching a CommandConfig in a field never initialized; receiving config from a lookup that returned null; copy-paste between the one-arg and two-arg executeCommand variants.
Related errors
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/f59ef26d113cc2f2.
Report an issue: GitHub.