{"record":{"id":"c1c77dd7c51bb4dd","repo":"quarkusio/quarkus","slug":"a-job-with-this-identity-is-already-scheduled-i","errorCode":null,"errorMessage":"A job with this identity is already scheduled: ${identity}","messagePattern":"A job with this identity is already scheduled: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/quartz/runtime/src/main/java/io/quarkus/quartz/runtime/QuartzSchedulerImpl.java","lineNumber":491,"sourceCode":"    public Trigger getScheduledJob(String identity) {\n        if (!isStarted()) {\n            throw notStarted();\n        }\n        Objects.requireNonNull(identity);\n        if (identity.isEmpty()) {\n            return null;\n        }\n        return scheduledTasks.get(SchedulerUtils.lookUpPropertyValue(identity));\n    }\n\n    @Override\n    public QuartzJobDefinition newJob(String identity) {\n        if (!isStarted()) {\n            throw notStarted();\n        }\n        Objects.requireNonNull(identity);\n        if (scheduledTasks.containsKey(identity)) {\n            throw new IllegalStateException(\"A job with this identity is already scheduled: \" + identity);\n        }\n        return new QuartzJobDefinitionImpl(identity);\n    }\n\n    @Override\n    public Trigger unscheduleJob(String identity) {\n        if (!isStarted()) {\n            throw notStarted();\n        }\n        Objects.requireNonNull(identity);\n        if (!identity.isEmpty()) {\n            String parsedIdentity = SchedulerUtils.lookUpPropertyValue(identity);\n            QuartzTrigger trigger = scheduledTasks.get(parsedIdentity);\n            if (trigger != null && trigger.isProgrammatic) {\n                if (scheduledTasks.remove(identity) != null) {\n                    try {\n                        scheduler.unscheduleJob(trigger.triggerKey);\n                    } catch (SchedulerException e) {","sourceCodeStart":473,"sourceCodeEnd":509,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/quartz/runtime/src/main/java/io/quarkus/quartz/runtime/QuartzSchedulerImpl.java#L473-L509","documentation":"Quarkus throws this IllegalStateException from Scheduler.newJob(identity) when a job (programmatic scheduled task) with the given identity is already registered in the scheduler's task map. Identities must be unique; this guard prevents silently overwriting an existing QuartzJobDefinition.","triggerScenarios":"Calling Scheduler.newJob(\"myJob\") twice with the same identity without unscheduling the first; identity collides with a statically declared @Scheduled job's identity; a previous programmatic job was never removed via unscheduleJob().","commonSituations":"Generating job identities without uniqueness (missing UUID/tenant suffix); re-registering on reconnect/redeploy logic; same identity reused across application restarts when tasks are kept in the JDBC store.","solutions":["Pick a unique identity per job instance (e.g. append a UUID or business key)","Check Scheduler.getScheduledJob(identity) for null before calling newJob()","Call Scheduler.unscheduleJob(identity) to remove the existing programmatic job first","Avoid reusing identities of static @Scheduled methods"],"exampleFix":"// before\nscheduler.newJob(\"report\"); // IllegalStateException on retry\n// after\nif (scheduler.getScheduledJob(\"report\") == null) {\n    scheduler.newJob(\"report\");\n} else {\n    scheduler.unscheduleJob(\"report\");\n    scheduler.newJob(\"report\");\n}","handlingStrategy":"validation","validationCode":"if (scheduler.getScheduledJob(identity) != null) {\n    throw new IllegalArgumentException(\"identity already used: \" + identity);\n}","typeGuard":null,"tryCatchPattern":"try {\n    scheduler.newJob(identity);\n} catch (IllegalStateException e) {\n    // identity taken — regenerate or unschedule first\n    scheduler.unscheduleJob(identity);\n    scheduler.newJob(identity + \"-\" + UUID.randomUUID());\n}","preventionTips":["Generate identities with a unique suffix (UUID, tenant id, timestamp)","Never reuse identities of @Scheduled-annotated methods","Check getScheduledJob(identity) == null before newJob()"],"tags":["quartz","scheduler","duplicate-identity","programmatic-job"],"backgroundTag":"duplicate-job-identity","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"}