quarkusio/quarkus · error · IllegalArgumentException

Cron job {identity} configured with invalid misfire policy {

Error message

Cron job {identity} configured with invalid misfire policy {policy}
Valid options are: {validCronValues}

What it means

Quarkus Quartz scheduler validates that the misfire policy configured for a cron job is one of the policies valid for cron triggers. If `quarkus.quartz.misfire-policy.<job>` (or the per-job config) names a policy that only applies to simple triggers (e.g. reschedule-now-with-remaining-repeat-count), `createTrigger` throws this IllegalArgumentException while building the cron trigger.

Source

Thrown at extensions/quartz/runtime/src/main/java/io/quarkus/quartz/runtime/QuartzSchedulerImpl.java:743

                    .getOrDefault(identity, runtimeConfig.cronTriggerConfig().misfirePolicyConfig());
            switch (perJobConfig.misfirePolicy()) {
                case SMART_POLICY:
                    // this is the default, doing nothing
                    break;
                case IGNORE_MISFIRE_POLICY:
                    cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
                    break;
                case FIRE_NOW:
                    cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
                    break;
                case CRON_TRIGGER_DO_NOTHING:
                    cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
                    break;
                case SIMPLE_TRIGGER_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT:
                case SIMPLE_TRIGGER_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT:
                case SIMPLE_TRIGGER_RESCHEDULE_NEXT_WITH_EXISTING_COUNT:
                case SIMPLE_TRIGGER_RESCHEDULE_NEXT_WITH_REMAINING_COUNT:
                    throw new IllegalArgumentException("Cron job " + identity
                            + " configured with invalid misfire policy "
                            + perJobConfig.misfirePolicy().dashedName() +
                            "\nValid options are: "
                            + QuartzMisfirePolicy.validCronValues().stream()
                                    .map(QuartzMisfirePolicy::dashedName)
                                    .collect(Collectors.joining(", ")));
            }

            scheduleBuilder = cronScheduleBuilder;
        } else if (!scheduled.every().isEmpty()) {
            OptionalLong everyMillis = SchedulerUtils.parseEveryAsMillis(scheduled);
            if (!everyMillis.isPresent()) {
                return Optional.empty();
            }
            SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                    .withIntervalInMilliseconds(everyMillis.getAsLong())
                    .repeatForever();
            QuartzRuntimeConfig.QuartzMisfirePolicyConfig perJobConfig = runtimeConfig.misfirePolicyPerJobs()

View on GitHub (pinned to e1c734241f)

Solutions

  1. Change the misfire policy for the cron job to a cron-valid option: cron-trigger-do-nothing, cron-trigger-fire-and-proceed, cron-trigger-fire-once-now, cron-trigger-ignore-misfire-cron, cron-trigger-smart-policy, or cron-trigger-schedule-1
  2. Remove the explicit misfire-policy config so the smart policy default applies
  3. Check `QuartzMisfirePolicy.validCronValues()` for the exact dashed names accepted

Example fix

// before (application.properties)
quarkus.quartz.misfire-policy.myJob=simple-trigger-reschedule-now-with-remaining-repeat-count
// after
quarkus.quartz.misfire-policy.myJob=cron-trigger-fire-once-now
Defensive patterns

Strategy: validation

Validate before calling

boolean valid = QuartzMisfirePolicy.validCronValues().contains(configuredPolicy);
if (!valid) { throw new IllegalArgumentException("Policy " + configuredPolicy + " not valid for cron jobs"); }

Prevention

When it happens

Trigger: Setting `quarkus.quartz.misfirePolicy` for a @Scheduled cron job to a SIMPLE-only value such as simple-trigger-reschedule-now-with-existing-repeat-count, then scheduling the job (createTrigger called via triggerBuilder).

Common situations: Copy-pasting a misfire policy from a simple-interval job to a cron job; typos in config causing a wrong enum; migration from simple to cron schedule without updating the misfire policy.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/8202439e8dfaf16f. Report an issue: GitHub.