flowable/flowable-engine · error · FlowableIllegalArgumentException

Invalid reschedule timer action. Reschedule timer actions mu

Error message

Invalid reschedule timer action. Reschedule timer actions must have a valid due date

What it means

The 'reschedule' action for a CMMN timer job requires a valid dueDate in the request. Flowable throws FlowableIllegalArgumentException when dueDate is null, because the engine cannot compute a new schedule without it.

Source

Thrown at modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/management/JobResource.java:257

    @PostMapping("/cmmn-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.rescheduleTimeDateValueJob(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 = "Execute a history job", tags = { "Jobs" }, code = 204)
    @ApiResponses(value = {
        @ApiResponse(code = 204, message = "Indicates the job was executed. 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("/cmmn-management/history-jobs/{jobId}")
    @ResponseStatus(HttpStatus.NO_CONTENT)

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Add a valid dueDate (ISO-8601) to the reschedule request body
  2. Ensure the field is named exactly dueDate
  3. Validate the date serializes correctly in your client library

Example fix

// before
{"action":"reschedule"}
// after
{"action":"reschedule","dueDate":"2026-02-01T08:00:00Z"}
Defensive patterns

Strategy: validation

Validate before calling

if (action === 'reschedule' && !body.dueDate) throw new Error('dueDate is required for reschedule');

Type guard

function canReschedule(r) { return !!r && r.action === 'reschedule' && typeof r.dueDate === 'string' && !isNaN(Date.parse(r.dueDate)); }

Try / catch

try { await reschedule(jobId, dueDate); }
catch (e) { if (e.status === 400 && /valid due date/.test(e.message)) { /* supply dueDate and retry once */ } else throw e; }

Prevention

When it happens

Trigger: POST /cmmn-management/timer-jobs/{jobId} with {"action":"reschedule"} but no dueDate field, or dueDate explicitly null.

Common situations: Clients sending only the action field copied from a 'move' request, JSON field-name typos like due_date, or forgetting the ISO-8601 date when migrating scripts from move to reschedule.

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


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/7aa8c9e231f3bcf3. Report an issue: GitHub.