{"record":{"id":"d3070ba2a2ba515b","repo":"quarkusio/quarkus","slug":"a-job-with-this-identity-is-already-scheduled","errorCode":null,"errorMessage":"A job with this identity is already scheduled: ","messagePattern":"A job with this identity is already scheduled: ","errorType":"exception","errorClass":"java.lang.IllegalStateException","httpStatus":null,"severity":"error","filePath":"extensions/scheduler/runtime/src/main/java/io/quarkus/scheduler/runtime/SimpleScheduler.java","lineNumber":186,"sourceCode":"\n    @Override\n    public boolean isStarted() {\n        return scheduledExecutor != null;\n    }\n\n    @Override\n    public String implementation() {\n        return Scheduled.SIMPLE;\n    }\n\n    @Override\n    public SimpleJobDefinition 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 SimpleJobDefinition(identity, schedulerConfig);\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            ScheduledTask task = scheduledTasks.get(parsedIdentity);\n            if (task != null && task.isProgrammatic) {\n                if (scheduledTasks.remove(task.trigger.id) != null) {\n                    return task.trigger;\n                }\n            }","sourceCodeStart":168,"sourceCodeEnd":204,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/scheduler/runtime/src/main/java/io/quarkus/scheduler/runtime/SimpleScheduler.java#L168-L204","documentation":"SimpleScheduler.newJob() refuses to create a new job definition builder when an identity already exists among scheduled tasks. Identities must be unique within the scheduler, so creating a second job with the same name is rejected eagerly with IllegalStateException rather than silently overwriting the existing schedule.","triggerScenarios":"Calling scheduler.newJob(\"some-identity\") when a task with that exact identity is already present in the scheduler's scheduledTasks map. The scheduler must already be started (otherwise a different notStarted error is thrown first).","commonSituations":"Re-running initialization code that schedules jobs without checking existing identities; hot redeploy or restart logic that re-registers the same job; generating job identities from user input or config where duplicates are possible.","solutions":["Check existence first: skip creation when the identity is already scheduled, or unscheduleJob(identity) before newJob(identity).","Generate unique identities (e.g. append a UUID or timestamp) when jobs are created dynamically.","Initialize job registration in exactly one place (a single StartupEvent observer or Scheduler schedulerNewJob flow) to avoid duplicate registration.","Catch IllegalStateException and treat it as 'already registered' if duplicate creation is expected.","Wrap job registration in an idempotency guard keyed by identity."],"exampleFix":"// before\nscheduler.newJob(\"daily-report\");\n// after\nif (scheduler.scheduledJobDefinitions().stream().noneMatch(j -> j.identity().equals(\"daily-report\"))) {\n    scheduler.newJob(\"daily-report\");\n}","handlingStrategy":"validation","validationCode":"if (scheduler.isStarted() && scheduler.scheduledJobDefinitions().stream().noneMatch(j -> j.identity().equals(identity))) {\n    scheduler.newJob(identity);\n}","typeGuard":"boolean isIdentityFree(Scheduler scheduler, String identity) {\n    return scheduler.scheduledJobDefinitions().stream().noneMatch(j -> j.identity().equals(identity));\n}","tryCatchPattern":"try {\n    scheduler.newJob(identity);\n} catch (IllegalStateException e) {\n    if (!e.getMessage().contains(\"already scheduled\")) throw e;\n    // identity already in use — proceed or log\n}","preventionTips":["Always check or derive identity uniqueness before newJob()","Register jobs in a single idempotent initialization point","Use unscheduleJob() before re-registering the same identity"],"tags":["scheduler","duplicate-identity","quarkus"],"backgroundTag":"duplicate-resource-registration","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"}