{"record":{"id":"309e6c080da890cc","repo":"elunez/eladmin","slug":"error-309e6c","errorCode":null,"errorMessage":"恢复定时任务失败","messagePattern":"恢复定时任务失败","errorType":"exception","errorClass":"BadRequestException","httpStatus":400,"severity":"error","filePath":"eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/QuartzManage.java","lineNumber":138,"sourceCode":"    }\n\n    /**\n     * 恢复一个job\n     * @param quartzJob /\n     */\n    public void resumeJob(QuartzJob quartzJob){\n        try {\n            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());\n            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);\n            // 如果不存在则创建一个定时任务\n            if(trigger == null) {\n                addJob(quartzJob);\n            }\n            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());\n            scheduler.resumeJob(jobKey);\n        } catch (Exception e){\n            log.error(\"恢复定时任务失败\", e);\n            throw new BadRequestException(\"恢复定时任务失败\");\n        }\n    }\n\n    /**\n     * 立即执行job\n     * @param quartzJob /\n     */\n    public void runJobNow(QuartzJob quartzJob){\n        try {\n            TriggerKey triggerKey = TriggerKey.triggerKey(JOB_NAME + quartzJob.getId());\n            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);\n            // 如果不存在则创建一个定时任务\n            if(trigger == null) {\n                addJob(quartzJob);\n            }\n            JobDataMap dataMap = new JobDataMap();\n            dataMap.put(QuartzJob.JOB_KEY, quartzJob);\n            JobKey jobKey = JobKey.jobKey(JOB_NAME + quartzJob.getId());","sourceCodeStart":120,"sourceCodeEnd":156,"githubUrl":"https://github.com/elunez/eladmin/blob/55fbf705956949697dbd68bf9003776609d3d029/eladmin-system/src/main/java/me/zhengjie/modules/quartz/utils/QuartzManage.java#L120-L156","documentation":"QuartzManage.resumeJob looks up the trigger by JOB_NAME+id; if absent it calls addJob(quartzJob) first, then scheduler.resumeJob(jobKey). Any exception in that sequence (including failures inside the nested addJob) is logged and rethrown as BadRequestException '恢复定时任务失败'. Used when un-pausing a job (updateIsPause).","triggerScenarios":"Calling the resume/执行 endpoint for a job whose trigger AND job detail are missing from the scheduler (the lazy addJob must succeed for resume to proceed), or when the scheduler itself is in an error state. Nested addJob failures propagate the same message.","commonSituations":"Job row exists in DB but scheduler store was reset (restart with RAMJobStore after a DB restore); scheduler misconfiguration surfacing here instead of at create time because addJob is lazily invoked.","solutions":["Check the log for the underlying exception logged just before the BadRequestException is raised.","If the trigger genuinely vanished, delete and recreate the job so addJob runs cleanly in the create path.","Ensure scheduler health (datasource for JDBC store, auto-startup enabled) before resuming jobs."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":"// verify trigger presence; recreate proactively rather than relying on the lazy addJob\nTriggerKey tk = TriggerKey.triggerKey(\"JOB_NAME\" + job.getId());\nif (scheduler.getTrigger(tk) == null) quartzManage.addJob(job);\nscheduler.resumeJob(JobKey.jobKey(\"JOB_NAME\" + job.getId()));","typeGuard":null,"tryCatchPattern":"try { quartzJobService.updateIsPause(job); } catch (BadRequestException e) { if (\"恢复定时任务失败\".equals(e.getMessage())) { log.error(\"resume failed\", e); return fail(\"请删除后重新创建该任务以重建调度状态\"); } throw e; }","preventionTips":["Recreate jobs whose scheduler state has drifted instead of fighting resume failures.","Monitor for quartz_job rows without live triggers after every restart.","Avoid switching a deployment between RAM and JDBC job stores."],"tags":["quartz","scheduler","state-mismatch","resume"],"backgroundTag":null,"analyzedSha":"55fbf705956949697dbd68bf9003776609d3d029","analyzedAt":"2026-08-14T11:56:12.758Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}