flowable/flowable-engine · error · FlowableIllegalArgumentException
Invalid reschedule timer action. Reschedule timer actions…
Error message
Invalid reschedule timer action. Reschedule timer actions must have a valid due date.
What it means
FlowableIllegalArgumentException thrown when action='reschedule' is sent to POST /management/timer-jobs/{jobId} but the request body has no 'dueDate' field. Rescheduling requires an explicit new due date, which is validated before the job is rescheduled via managementService.rescheduleTimeDateJob.
Solutions
- Add a valid dueDate to the request body: {"action":"reschedule","dueDate":"2026-09-12T10:00:00Z"}
- Send an ISO-8601 date string the server can parse into a Date
- If no new date is intended, use action 'move' instead to push the timer job to the executable table immediately
- Validate client-side that dueDate is non-null and parseable before calling the endpoint
Example fix
// before
{"action":"reschedule"}
// after
{"action":"reschedule","dueDate":"2026-09-12T10:00:00+02:00"} Defensive patterns
Strategy: validation
Validate before calling
if (action === 'reschedule' && (!dueDate || isNaN(Date.parse(dueDate)))) throw new Error('valid dueDate required for reschedule'); Type guard
function hasDueDate(b) { return typeof b?.dueDate === 'string' && !isNaN(Date.parse(b.dueDate)); } Prevention
- Always pair action='reschedule' with an ISO-8601 dueDate
- Client-side validate the date parses before calling
- Use 'move' when you want immediate execution instead of a date
When it happens
Trigger: POST /management/timer-jobs/{jobId} with {"action":"reschedule"} and either no dueDate key, dueDate: null, or an empty string that maps to null.
Common situations: Clients that copy the 'move' action payload and only change the action field, forms that leave the date picker empty, DTO serialization dropping null fields client-side, misunderstanding that reschedule requires dueDate while move does not.
Understand the failure class
Background: "missing required argument" and "the following required arguments were not provided": what required-argument errors mean and how to fix them — this error's family across 20 libraries.
Related errors
- Id cannot be null.
- A request body was expected when executing the form submit.
- Attachment name is required.
- Comment text is required.
- Either processDefinitionId, processDefinitionKey or message…
AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11).
Data as JSON: /api/errors/2b14d30f34778ba9.
Report an issue: GitHub.
Appendix: source
Thrown at modules/flowable-rest/src/main/java/org/flowable/rest/service/api/management/JobResource.java:298
@PostMapping("/management/timer-jobs/{jobId}")
@ResponseStatus(HttpStatus.NO_CONTENT)
public void executeTimerJobAction(@ApiParam(name = "jobId") @PathVariable String jobId, @RequestBody TimerJobActionRequest actionRequest) {
if (actionRequest == null || !(MOVE_ACTION.equals(actionRequest.getAction()) || RESCHEDULE_ACTION.equals(actionRequest.getAction()))) {
throw new FlowableIllegalArgumentException("Invalid action, only 'move' or 'reschedule' are supported.");
}
Job job = getTimerJobById(jobId);
if (MOVE_ACTION.equals(actionRequest.getAction())) {
try {
managementService.moveTimerToExecutableJob(job.getId());
} catch (FlowableObjectNotFoundException e) {
// Re-throw to have consistent error-messaging across REST-api
throw new FlowableObjectNotFoundException("Could not find a timer job with id '" + jobId + "'.", Job.class);
}
} else if (RESCHEDULE_ACTION.equals(actionRequest.getAction())) {
if (actionRequest.getDueDate() == null) {
throw new FlowableIllegalArgumentException("Invalid reschedule timer action. Reschedule timer actions must have a valid due date.");
}
try {
managementService.rescheduleTimeDateJob(job.getId(), actionRequest.getDueDate());
} catch (FlowableObjectNotFoundException e) {
// Re-throw to have consistent error-messaging across REST-api
throw new FlowableObjectNotFoundException("Could not find a timer job with id '" + jobId + "'.", Job.class);
}
}
}
@ApiOperation(value = "Move a single deadletter job. Accepts 'move' and 'moveToHistoryJob' as action.", tags = { "Jobs" }, code = 204)
@ApiResponses(value = {
@ApiResponse(code = 204, message = "Indicates the dead letter job was moved. Response-body is intentionally empty."),
@ApiResponse(code = 404, message = "Indicates the requested job was not found."),
@ApiResponse(code = 500, message = "Indicates the an exception occurred while executing the job. The status-description contains additional detail about the error. The full error-stacktrace can be fetched later on if needed.")
})
@PostMapping("/management/deadletter-jobs/{jobId}")
@ResponseStatus(HttpStatus.NO_CONTENT)View on GitHub (pinned to d6d39ce1c6)