{"record":{"id":"26f7aab0a6234541","repo":"quarkusio/quarkus","slug":"either-the-cron-expression-or-the-every-period","errorCode":null,"errorMessage":"Either the 'cron' expression or the 'every' period must be set: ","messagePattern":"Either the 'cron' expression or the 'every' period must be set: ","errorType":"exception","errorClass":"java.lang.IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"extensions/scheduler/runtime/src/main/java/io/quarkus/scheduler/runtime/SimpleScheduler.java","lineNumber":377,"sourceCode":"        String descriptionValue = SchedulerUtils.lookUpPropertyValue(scheduled.description());\n        String description = descriptionValue.isEmpty() ? null : descriptionValue;\n        if (!scheduled.cron().isEmpty()) {\n            String cron = SchedulerUtils.lookUpPropertyValue(scheduled.cron());\n            if (SchedulerUtils.isOff(cron)) {\n                return Optional.empty();\n            }\n            return Optional.of(new CronTrigger(id, start, cronParser.parse(cron),\n                    SchedulerUtils.parseOverdueGracePeriod(scheduled, defaultGracePeriod),\n                    SchedulerUtils.parseCronTimeZone(scheduled), methodDescription, description));\n        } else if (!scheduled.every().isEmpty()) {\n            final OptionalLong everyMillis = SchedulerUtils.parseEveryAsMillis(scheduled);\n            if (everyMillis.isEmpty()) {\n                return Optional.empty();\n            }\n            return Optional.of(new IntervalTrigger(id, start, everyMillis.getAsLong(),\n                    SchedulerUtils.parseOverdueGracePeriod(scheduled, defaultGracePeriod), methodDescription, description));\n        } else {\n            throw new IllegalArgumentException(\"Either the 'cron' expression or the 'every' period must be set: \" + scheduled);\n        }\n    }\n\n    static class ScheduledTask {\n\n        final boolean isProgrammatic;\n        final SimpleTrigger trigger;\n        final ScheduledInvoker invoker;\n\n        ScheduledTask(SimpleTrigger trigger, ScheduledInvoker invoker, boolean isProgrammatic) {\n            this.trigger = trigger;\n            this.invoker = invoker;\n            this.isProgrammatic = isProgrammatic;\n        }\n\n        void execute(ZonedDateTime now, Vertx vertx) {\n            if (!trigger.isRunning()) {\n                return;","sourceCodeStart":359,"sourceCodeEnd":395,"githubUrl":"https://github.com/quarkusio/quarkus/blob/e1c734241f34c7919086ceb4c9262b4a58f6de44/extensions/scheduler/runtime/src/main/java/io/quarkus/scheduler/runtime/SimpleScheduler.java#L359-L395","documentation":"createTrigger() requires one of two scheduling mechanisms on the @Scheduled annotation/config: a 'cron' expression or an 'every' interval period. When neither is set, the scheduler cannot compute any trigger and throws IllegalArgumentException listing the offending @Scheduled method.","triggerScenarios":"A @Scheduled method (or programmatic Schedule config) declares neither cron() nor every() — e.g. @Scheduled with only delayed/overdue settings, or both left blank/empty.","commonSituations":"Misconfigured @Scheduled annotation where the developer removed cron but forgot every (or vice versa); building a schedule programmatically with a builder that only sets gracePeriod/delay; config property overriding cron/every to an empty string.","solutions":["Add a cron expression: @Scheduled(cron = \"0 15 10 * * ?\") or set quarkus.scheduler.cron-type-compatible config.","Add an interval: @Scheduled(every = \"10s\") or every = \"{property:expression}\".","If the value comes from config, verify the property (e.g. app.some.every) resolves to a non-empty duration.","If the schedule should be conditional, guard with @Scheduled(every=\"0\")-style disabled convention or skip scheduling in code rather than leaving both unset.","Programmatic API: call either cron(...) or every(...) on the JobDefinition before schedule()."],"exampleFix":"// before\n@Scheduled(delayed = \"10s\")\nvoid run() { ... }\n// after\n@Scheduled(delayed = \"10s\", every = \"5m\")\nvoid run() { ... }","handlingStrategy":"validation","validationCode":"Scheduled s = method.getAnnotation(Scheduled.class);\nif ((s == null || (s.cron().isEmpty() && s.every().isEmpty()))) {\n    throw new IllegalArgumentException(\"@Scheduled on \" + method + \" must set cron or every\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    trigger = schedulerRuntime.createTrigger(...);\n} catch (IllegalArgumentException e) {\n    log.error(\"Schedule misconfigured: set either cron or every\", e);\n}","preventionTips":["Always set either cron or every on @Scheduled","When externalizing to config, verify the property resolves non-empty at startup","Add a startup-time config validation test"],"tags":["scheduler","config","cron","quarkus"],"backgroundTag":"missing-required-config","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"}