flowable/flowable-engine · critical · FlowableException

Could not find an implementation of the org.flowable.cdi.imp

Error message

Could not find an implementation of the org.flowable.cdi.impl.cmmn.CmmnEngineLookup service returning a non-null cmmnEngine. Giving up.

What it means

FlowableCmmnExtension (a CDI extension) resolves the CMMN engine by iterating registered CmmnEngineLookup service implementations. If none returns a non-null engine, it throws FlowableException because the CDI environment cannot obtain a CMMN engine to wire into managed beans.

Source

Thrown at modules/flowable-cmmn-cdi/src/main/java/org/flowable/cdi/impl/FlowableCmmnExtension.java:89

                return (-1) * ((Integer) o1.getPrecedence()).compareTo(o2.getPrecedence());
            }
        });

        CmmnEngine cmmnEngine = null;

        for (CmmnEngineLookup cmmnEngineLookup : discoveredLookups) {
            cmmnEngine = cmmnEngineLookup.getCmmnEngine();
            if (cmmnEngine != null) {
                this.cmmnEngineLookup = cmmnEngineLookup;
                LOGGER.debug("CmmnEngineLookup service {} returned cmmn engine.", cmmnEngineLookup.getClass());
                break;
            } else {
                LOGGER.debug("CmmnEngineLookup service {} returned 'null' value.", cmmnEngineLookup.getClass());
            }
        }

        if (cmmnEngineLookup == null) {
            throw new FlowableException(
                    "Could not find an implementation of the " + CmmnEngineLookup.class.getName() + " service returning a non-null cmmnEngine. Giving up.");
        }

        Bean<FlowableCmmnServices> flowableCmmnServicesBean = (Bean<FlowableCmmnServices>) beanManager.getBeans(FlowableCmmnServices.class).stream()
                .findAny()
                .orElseThrow(
                        () -> new IllegalStateException("CDI BeanManager cannot find an instance of requested type " + FlowableCmmnServices.class.getName()));
        FlowableCmmnServices services = (FlowableCmmnServices) beanManager
                .getReference(flowableCmmnServicesBean, FlowableCmmnServices.class, beanManager.createCreationalContext(flowableCmmnServicesBean));
        services.setCmmnEngine(cmmnEngine);

        return cmmnEngine;
    }

    public void beforeShutdown(@Observes BeforeShutdown event) {
        if (cmmnEngineLookup != null) {
            cmmnEngineLookup.ungetCmmnEngine();
            cmmnEngineLookup = null;

View on GitHub (pinned to d6d39ce1c6)

Solutions

  1. Register a CmmnEngineLookup implementation in META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup
  2. Ensure the lookup returns a built CmmnEngine (build via CmmnEngineConfiguration and expose it)
  3. Verify flowable-cmmn-engine is on the classpath and the engine initializes before afterDeploymentValidation
  4. Check that the CDI extension is not active in modules that intentionally have no CMMN engine

Example fix

// before
// (no service file)
// after
// file: src/main/resources/META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup
// content: com.myapp.MyCmmnEngineLookup
Defensive patterns

Strategy: validation

Validate before calling

boolean lookupPresent = getClass().getClassLoader()
    .getResources("META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup").hasMoreElements();
if (!lookupPresent) throw new IllegalStateException("No CmmnEngineLookup registered for flowable-cmmn-cdi");

Type guard

CmmnEngine engine = cmmnEngineLookup != null ? cmmnEngineLookup.getCmmnEngine() : null;
if (engine == null) throw new IllegalStateException("CmmnEngineLookup returned null engine");

Try / catch

try { cmmnExtension.bootstrap(); } catch (FlowableException e) { throw new IllegalStateException("CDI CMMN engine not configured: " + e.getMessage(), e); }

Prevention

When it happens

Trigger: Deploying a CDI application with FlowableCmmnExtension enabled but with no CmmnEngineLookup service implementation registered (via META-INF/services) or every lookup returning null because the CMMN engine was never built/started.

Common situations: Missing service descriptor file META-INF/services/org.flowable.cdi.impl.cmmn.CmmnEngineLookup; forgetting to create the CmmnEngue in a StandaloneInit-like bootstrap; mixing flowable-cmmn-cdi without engine configuration; wrong bean archive discovery.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


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