{"record":{"id":"f4406d78ed1ebcbf","repo":"quarkusio/quarkus","slug":"unable-to-resume-scheduler","errorCode":null,"errorMessage":"Unable to resume scheduler","messagePattern":"Unable to resume scheduler","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"extensions/quartz/runtime/src/main/java/io/quarkus/quartz/runtime/QuartzSchedulerImpl.java","lineNumber":425,"sourceCode":"            return true;\n        } catch (SchedulerException e1) {\n            LOGGER.warnf(e1, \"Cannot obtain triggers for job with identity %s\", identity);\n            return false;\n        }\n    }\n\n    @Override\n    public void resume() {\n        if (!isStarted()) {\n            throw notStarted();\n        }\n        try {\n            if (scheduler != null) {\n                scheduler.start();\n                events.fireSchedulerResumed();\n            }\n        } catch (SchedulerException e) {\n            throw new RuntimeException(\"Unable to resume scheduler\", e);\n        }\n    }\n\n    @Override\n    public void resume(String identity) {\n        if (!isStarted()) {\n            throw notStarted();\n        }\n        Objects.requireNonNull(identity, \"Cannot resume - identity is null\");\n        if (identity.isEmpty()) {\n            LOGGER.warn(\"Cannot resume - identity is empty\");\n            return;\n        }\n        try {\n            String parsedIdentity = SchedulerUtils.lookUpPropertyValue(identity);\n            QuartzTrigger trigger = scheduledTasks.get(parsedIdentity);\n            if (trigger != null) {\n                scheduler.resumeJob(new JobKey(SchedulerUtils.lookUpPropertyValue(parsedIdentity), Scheduler.class.getName()));","sourceCodeStart":407,"sourceCodeEnd":443,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/quartz/runtime/src/main/java/io/quarkus/quartz/runtime/QuartzSchedulerImpl.java#L407-L443","documentation":"Quarkus wraps a Quartz SchedulerException thrown while resuming the scheduler from standby via Scheduler.resume() into this RuntimeException. resume() calls scheduler.start() on the underlying Quartz scheduler; failures from the JobStore or trigger recovery surface here with the SchedulerException as cause.","triggerScenarios":"Calling Scheduler.resume() after pause() when the underlying Quartz scheduler.start() fails — typically a JobStore error (JDBC store DB unreachable, cluster recovery failure) during restart of trigger processing.","commonSituations":"Database-backed store was down during standby and is still unreachable at resume; clustered Quartz instance fails to reacquire triggers; corrupted trigger state in qrtz tables.","solutions":["Check the cause SchedulerException for the JobStore/DB error","Verify the datasource used by the quartz store is up","Check cluster health / qrtz scheduler state rows if running clustered","Restart the application if the scheduler cannot recover the store"],"exampleFix":"// before\nscheduler.resume();\n// after\ntry {\n    scheduler.resume();\n} catch (RuntimeException e) {\n    LOGGER.errorf(e.getCause(), \"Quartz resume failed; verify JobStore availability\");\n}","handlingStrategy":"try-catch","validationCode":"if (!scheduler.isStarted()) { throw new IllegalStateException(\"Scheduler not started\"); }","typeGuard":null,"tryCatchPattern":"try {\n    scheduler.resume();\n} catch (RuntimeException e) {\n    LOGGER.errorf(e.getCause(), \"Cannot resume scheduler\");\n    // retry after store recovers\n}","preventionTips":["Only resume after the JobStore datasource is confirmed healthy","Pair pause()/resume() calls with idempotent state tracking","Alert on resume failure — jobs stay paused otherwise"],"tags":["quartz","scheduler","resume","jobstore"],"backgroundTag":"scheduler-resume-failed","analyzedSha":"e1c734241f34c7919086ceb4c9262b4a58f6de44","analyzedAt":"2026-09-05T17:01:29.979Z","contentChangedAt":"2026-09-05T17:01:29.979Z","schemaVersion":2},"datasetVersion":"2026-09-12T22:17:10.623Z"}