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
- Correct the duedate string to a valid cron expression or an R/duration cycle
- 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
- Parsing and encoding errors: unexpected token, malformed input — why parsers reject input and how to find the real culprit.
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)