flowable/flowable-engine · error · org.flowable.common.engine.api.FlowableException

Failed to parse cron expression

Error message

Failed to parse cron expression: ${duedateDescription}

What it means

Wrapper thrown by CycleBusinessCalendar.resolveDuedate: the duedate description was treated as a cron expression and CronExpression parsing failed, meaning the timer/cycle configuration string is not a valid cron (and not a valid R/ISO duration cycle either).

Solutions

  1. Correct the duedate string to a valid cron expression or an R/duration cycle
  2. Test the expression with a cron validator before deploying the process definition
Defensive patterns

Strategy: try-catch

When it happens

Trigger: Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/calendar/CycleBusinessCalendar.java:39 when the library encounters an invalid state.

Common situations: See trigger scenarios.

Understand the failure class


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/475143ffcb323d13. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-engine-common/src/main/java/org/flowable/common/engine/impl/calendar/CycleBusinessCalendar.java:39

    public static final String NAME = "cycle";

    public CycleBusinessCalendar(ClockReader clockReader) {
        super(clockReader);
    }

    @Override
    public Date resolveDuedate(String duedateDescription, int maxIterations) {
        try {
            if (duedateDescription != null && duedateDescription.startsWith("R")) {
                return new DurationHelper(duedateDescription, maxIterations, clockReader).getDateAfter();
            } else {
                CronExpression ce = new CronExpression(duedateDescription, clockReader);
                return ce.getTimeAfter(clockReader.getCurrentTime());
            }

        } catch (Exception e) {
            throw new FlowableException("Failed to parse cron expression: " + duedateDescription, e);
        }

    }

    @Override
    public Boolean validateDuedate(String duedateDescription, int maxIterations, Date endDate, Date newTimer) {
        if (endDate != null) {
            return super.validateDuedate(duedateDescription, maxIterations, endDate, newTimer);
        }
        // end date could be part of the cron expression
        try {
            if (duedateDescription != null && duedateDescription.startsWith("R")) {
                return new DurationHelper(duedateDescription, maxIterations, clockReader).isValidDate(newTimer);
            } else {
                return true;
            }

        } catch (Exception e) {

View on GitHub (pinned to d6d39ce1c6)