{"record":{"id":"6bd0996b7a24062e","repo":"flowable/flowable-engine","slug":"no-event-key-configured-for-servicetask-getid","errorCode":null,"errorMessage":"No event key configured for ${serviceTask.getId()} for ${planItemInstanceEntity}","messagePattern":"No event key configured for (.+?) for (.+?)","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/SendEventActivityBehavior.java","lineNumber":159,"sourceCode":"\n        EventRepositoryService eventRepositoryService = CommandContextUtil.getEventRegistryEngineConfiguration(commandContext).getEventRepositoryService();\n        List<ChannelModel> channelModels = new ArrayList<>(channelKeys.size());\n        for (String channelKey : channelKeys) {\n            if (Objects.equals(CmmnEngineConfiguration.NO_TENANT_ID, planItemInstanceEntity.getTenantId())) {\n                channelModels.add(eventRepositoryService.getChannelModelByKey(channelKey));\n            } else {\n                channelModels.add(eventRepositoryService.getChannelModelByKey(channelKey, planItemInstanceEntity.getTenantId()));\n            }\n        }\n\n        return channelModels;\n    }\n\n    protected String getEventKey(PlanItemInstanceEntity planItemInstanceEntity) {\n        if (StringUtils.isNotEmpty(serviceTask.getEventType())) {\n            return serviceTask.getEventType();\n        } else {\n            throw new FlowableException(\"No event key configured for \" + serviceTask.getId() + \" for \" + planItemInstanceEntity);\n        }\n    }\n\n}\n","sourceCodeStart":141,"sourceCodeEnd":164,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-cmmn-engine/src/main/java/org/flowable/cmmn/engine/impl/behavior/impl/SendEventActivityBehavior.java#L141-L164","documentation":"A CMMN send-event service task has no event type/key configured. Flowable needs an event key to know which event to throw when the plan item runs; without it the engine cannot proceed and throws a FlowableException. This is checked at runtime in getEventKey when the behavior executes.","triggerScenarios":"A SendEventActivityBehavior executes for a plan item whose serviceTask has getEventType() empty or null.","commonSituations":"CMMN XML/builder model defines a send-event task but the flowable:eventType attribute (or ServiceTask event type in the builder API) was omitted; copy-pasted task definitions missing the event type.","solutions":["Set the event type on the service task definition: add flowable:eventType=\"myEventKey\" (or serviceTask.setEventType(\"myEventKey\")) to the send-event plan item","Redeploy the corrected case definition so the running plan item picks up the new model","Check the deployed case XML in ACT_CMMN_CASEDEF / repository to confirm the attribute was really in the deployed resource"],"exampleFix":"// before\n<flowable:service-task id=\"sendTask\" flowable:type=\"send-event\" />\n// after\n<flowable:service-task id=\"sendTask\" flowable:type=\"send-event\" flowable:eventType=\"orderShipped\" />","handlingStrategy":"validation","validationCode":"const eventType = serviceTask.getEventType?.();\nif (!eventType || eventType.trim() === '') throw new Error(`send-event task ${serviceTask.getId()} missing eventType`);","typeGuard":"function hasEventType(t) { return typeof t?.getEventType === 'function' && !!t.getEventType(); }","tryCatchPattern":null,"preventionTips":["Always set flowable:eventType on send-event service tasks","Model-validate case definitions in CI before deployment","Add a unit test that walks all send-event tasks and asserts a non-empty event type"],"tags":["cmmn","configuration","missing-attribute"],"backgroundTag":"missing-required-config-field","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}