{"record":{"id":"2340630d23d6430e","repo":"flowable/flowable-engine","slug":"could-not-find-a-timer-job-with-id-jobid","errorCode":null,"errorMessage":"Could not find a timer job with id '${jobId}'.","messagePattern":"Could not find a timer job with id '(.+?)'\\.","errorType":"http","errorClass":"FlowableObjectNotFoundException","httpStatus":404,"severity":"error","filePath":"modules/flowable-cmmn-rest/src/main/java/org/flowable/cmmn/rest/service/api/management/JobResource.java","lineNumber":253,"sourceCode":"            @ApiResponse(code = 204, message = \"Indicates the timer job action 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/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.\"),","sourceCodeStart":235,"sourceCodeEnd":271,"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#L235-L271","documentation":"When moving a suspended timer job to the executable queue, the engine could not find the given job id. Flowable re-throws the engine's FlowableObjectNotFoundException with a standardized REST message so error messaging is consistent across the REST API.","triggerScenarios":"POST /cmmn-management/timer-jobs/{jobId} with action 'move' where jobId does not correspond to an existing timer job (already executed/moved, wrong engine, or never existed).","commonSituations":"Using a stale jobId after the timer already fired or was moved, mixing ids from the process-engine REST API with the CMMN API, or a typo in the id.","solutions":["Verify the jobId exists by GETting the timer job or listing timer jobs first","Confirm you are querying the same CMMN engine/database the job lives in","Re-check that the job wasn't already moved or consumed"],"exampleFix":"// before\nPOST /cmmn-management/timer-jobs/unknown-id {\"action\":\"move\"}\n// after\n// look up a valid id first\nGET /cmmn-management/timer-jobs?scopeId=myCase\nthen POST /cmmn-management/timer-jobs/{validId} {\"action\":\"move\"}","handlingStrategy":"try-catch","validationCode":"const job = await get(`/cmmn-management/timer-jobs/${jobId}`);\nif (!job) throw new Error(`timer job ${jobId} not found`);","typeGuard":null,"tryCatchPattern":"try { await moveTimerJob(jobId); }\ncatch (e) { if (e.status === 404 && /Could not find a timer job/.test(e.message)) { /* refresh job list or skip */ } else throw e; }","preventionTips":["Re-fetch job ids before acting — jobs disappear when executed","Keep CMMN and process-engine ids separate","Log jobId plus engine/tenant to trace mismatched scopes"],"tags":["rest","not-found","job"],"backgroundTag":"resource-not-found","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}