{"record":{"id":"e294f638db415b3f","repo":"flowable/flowable-engine","slug":"no-cdi-bean-manager-available-cannot-publish-even-e294f6","errorCode":null,"errorMessage":"No cdi bean manager available, cannot publish event.","messagePattern":"No cdi bean manager available, cannot publish event\\.","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cdi/src/main/java/org/flowable/cdi/impl/event/CdiTaskListener.java","lineNumber":87,"sourceCode":"            return;\r\n        }\r\n\r\n        BusinessProcessEvent event = createEvent(task);\r\n        Annotation[] qualifiers = getQualifiers(event);\r\n        getBeanManager().getEvent().select(qualifiers).fire(event);\r\n    }\r\n\r\n    protected BusinessProcessEvent createEvent(DelegateTask task) {\r\n        ProcessEngineConfigurationImpl engineConfiguration = org.flowable.engine.impl.context.Context.getProcessEngineConfiguration();\r\n        ProcessDefinition processDefinition = engineConfiguration.getProcessDefinitionCache().get(task.getProcessDefinitionId()).getProcessDefinition();\r\n        Date now = engineConfiguration.getClock().getCurrentTime();\r\n        return new CdiBusinessProcessEvent(activityId, transitionName, processDefinition, task, type, task.getProcessInstanceId(), task.getExecutionId(), now);\r\n    }\r\n\r\n    protected BeanManager getBeanManager() {\r\n        BeanManager bm = BeanManagerLookup.getBeanManager();\r\n        if (bm == null) {\r\n            throw new FlowableException(\"No cdi bean manager available, cannot publish event.\");\r\n        }\r\n        return bm;\r\n    }\r\n\r\n    protected Annotation[] getQualifiers(BusinessProcessEvent event) {\r\n        Annotation businessProcessQualifier = new BusinessProcessLiteral(event.getProcessDefinition().getKey());\r\n        if (type == BusinessProcessEventType.CREATE_TASK) {\r\n            return new Annotation[] { businessProcessQualifier, new CreateTaskLiteral(activityId) };\r\n        }\r\n        if (type == BusinessProcessEventType.ASSIGN_TASK) {\r\n            return new Annotation[] { businessProcessQualifier, new AssignTaskLiteral(activityId) };\r\n        }\r\n        if (type == BusinessProcessEventType.COMPLETE_TASK) {\r\n            return new Annotation[] { businessProcessQualifier, new CompleteTaskLiteral(activityId) };\r\n        }\r\n        if (type == BusinessProcessEventType.DELETE_TASK) {\r\n            return new Annotation[] { businessProcessQualifier, new DeleteTaskLiteral(activityId) };\r\n        }\r","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cdi/src/main/java/org/flowable/cdi/impl/event/CdiTaskListener.java#L69-L105","documentation":"CdiTaskListener.getBeanManager() throws FlowableException when BeanManagerLookup yields null while a task listener publishes a CDI business event. Without a BeanManager the CDI event machinery cannot fire, so the engine aborts rather than silently dropping events. This means the flowable-cdi module is active but no CDI container/BeanManager was resolvable.","triggerScenarios":"A task listener fires (task create/assign/complete) and BeanManagerLookup.getBeanManager() returns null — both JNDI lookups and the localInstance fallback failed, e.g. in a non-CDI environment with flowable-cdi listeners wired into the engine.","commonSituations":"Spring Boot or plain Java apps that accidentally include flowable-cdi listeners; missing beans.xml/ CDI activation in a WAR; unit tests booting the engine outside an app server without a localInstance BeanManager set.","solutions":["Set BeanManagerLookup.setLocalInstance(beanManager) during application startup before tasks execute.","Remove flowable-cdi dependencies/listeners if CDI is not your runtime (use Spring integration or plain event listeners instead).","Enable CDI in the deployment (beans.xml, bean-discovery-mode) so java:comp/BeanManager is available in JNDI.","Replace CDI task listeners with engine TaskListeners/ FlowableEventListener implementations that don't need CDI."],"exampleFix":"// before: listener throws at runtime in tests\n// after: test setup\nBeanManagerLookup.setLocalInstance(mockOrRealBeanManager);\nengine = ProcessEngineConfiguration...buildProcessEngine();","handlingStrategy":"validation","validationCode":"if (org.flowable.cdi.impl.util.BeanManagerLookup.getBeanManager() == null) {\n    org.flowable.cdi.impl.util.BeanManagerLookup.setLocalInstance(\n        jakarta.enterprise.inject.spi.CDI.current().select(jakarta.enterprise.inject.spi.BeanManager.class).get());\n}","typeGuard":"boolean canPublishCdiTaskEvents() {\n    return org.flowable.cdi.impl.util.BeanManagerLookup.getBeanManager() != null;\n}","tryCatchPattern":"try {\n    taskListener.notify(delivery);\n} catch (org.flowable.common.engine.api.FlowableException e) {\n    if (e.getMessage().contains(\"No cdi bean manager\")) {\n        logger.warn(\"Task CDI event skipped: no BeanManager\");\n    } else { throw e; }\n}","preventionTips":["Set BeanManagerLookup.setLocalInstance at startup in SE/ test environments.","Verify beans.xml bean-discovery-mode before deploying task listeners that publish CDI events.","Remove flowable-cdi listeners in Spring Boot/ non-CDI apps.","Smoke-test task creation in each environment to catch missing BeanManager early."],"tags":["flowable","cdi","bean-manager","task-listener"],"backgroundTag":"missing-dependency","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}