{"record":{"id":"7aa8c9e231f3bcf3","repo":"flowable/flowable-engine","slug":"invalid-reschedule-timer-action-reschedule-timer","errorCode":null,"errorMessage":"Invalid reschedule timer action. Reschedule timer actions must have a valid due date","messagePattern":"Invalid reschedule timer action\\. Reschedule timer actions must have a valid due date","errorType":"http","errorClass":"FlowableIllegalArgumentException","httpStatus":400,"severity":"error","filePath":"modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/management/JobResource.java","lineNumber":257,"sourceCode":"    @PostMapping(\"/cmmn-management/timer-jobs/{jobId}\")\n    @ResponseStatus(HttpStatus.NO_CONTENT)\n    public void executeTimerJobAction(@ApiParam(name = \"jobId\") @PathVariable String jobId, @RequestBody TimerJobActionRequest actionRequest) {\n        if (actionRequest == null || !(MOVE_ACTION.equals(actionRequest.getAction()) || RESCHEDULE_ACTION.equals(actionRequest.getAction()))) {\n            throw new FlowableIllegalArgumentException(\"Invalid action, only 'move' or 'reschedule' are supported.\");\n        }\n        \n        Job job = getTimerJobById(jobId);\n\n        if (MOVE_ACTION.equals(actionRequest.getAction())) {\n            try {\n                managementService.moveTimerToExecutableJob(job.getId());\n            } catch (FlowableObjectNotFoundException e) {\n                // Re-throw to have consistent error-messaging across REST-api\n                throw new FlowableObjectNotFoundException(\"Could not find a timer job with id '\" + jobId + \"'.\", Job.class);\n            }\n        } else if (RESCHEDULE_ACTION.equals(actionRequest.getAction())) {\n            if (actionRequest.getDueDate() == null) {\n                throw new FlowableIllegalArgumentException(\"Invalid reschedule timer action. Reschedule timer actions must have a valid due date\");\n            }\n            try {\n                managementService.rescheduleTimeDateValueJob(job.getId(), actionRequest.getDueDate());\n            } catch (FlowableObjectNotFoundException e) {\n                // Re-throw to have consistent error-messaging across REST-api\n                throw new FlowableObjectNotFoundException(\"Could not find a timer job with id '\" + jobId + \"'.\", Job.class);\n            }\n        }\n    }\n\n    @ApiOperation(value = \"Execute a history job\", tags = { \"Jobs\" }, code = 204)\n    @ApiResponses(value = {\n        @ApiResponse(code = 204, message = \"Indicates the job was executed. Response-body is intentionally empty.\"),\n        @ApiResponse(code = 404, message = \"Indicates the requested job was not found.\"),\n        @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.\")\n    })\n    @PostMapping(\"/cmmn-management/history-jobs/{jobId}\")\n    @ResponseStatus(HttpStatus.NO_CONTENT)","sourceCodeStart":239,"sourceCodeEnd":275,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/management/JobResource.java#L239-L275","documentation":"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.","triggerScenarios":"POST /cmmn-management/timer-jobs/{jobId} with {\"action\":\"reschedule\"} but no dueDate field, or dueDate explicitly null.","commonSituations":"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.","solutions":["Add a valid dueDate (ISO-8601) to the reschedule request body","Ensure the field is named exactly dueDate","Validate the date serializes correctly in your client library"],"exampleFix":"// before\n{\"action\":\"reschedule\"}\n// after\n{\"action\":\"reschedule\",\"dueDate\":\"2026-02-01T08:00:00Z\"}","handlingStrategy":"validation","validationCode":"if (action === 'reschedule' && !body.dueDate) throw new Error('dueDate is required for reschedule');","typeGuard":"function canReschedule(r) { return !!r && r.action === 'reschedule' && typeof r.dueDate === 'string' && !isNaN(Date.parse(r.dueDate)); }","tryCatchPattern":"try { await reschedule(jobId, dueDate); }\ncatch (e) { if (e.status === 400 && /valid due date/.test(e.message)) { /* supply dueDate and retry once */ } else throw e; }","preventionTips":["Validate ISO-8601 date serialization in your client","Use a typed request model for the action payload","Unit-test reschedule payloads against the endpoint"],"tags":["rest","validation","missing-field"],"backgroundTag":"missing-required-argument","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}