flowable/flowable-engine · error · FlowableException

There are event definitions with key = ' ' and version = '…

Error message

There are ${results.size()} event definitions with key = '${eventDefinitionKey}' and version = '${eventVersion}'.

What it means

Thrown by MybatisEventDefinitionDataManager.findEventDefinitionByKeyAndVersion when selectEventDefinitionsByKeyAndVersion returns more than one EventDefinitionEntity for the same key and version. Event definition key+version is expected to be unique, so multiple rows signal duplicate persisted data. Deployment lookups relying on this method then fail with this FlowableException.

Solutions

  1. Inspect and clean duplicates: SELECT * FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_=? AND VERSION_=? and remove all but one row.
  2. Serialize event model deployment across nodes (lock or leader-elected deployment on startup).
  3. Add a unique database constraint on (KEY_, VERSION_) to prevent recurrence.
  4. Keep the row whose DEPLOYMENT_ID_ still exists and delete orphans.

Example fix

-- before (duplicate rows break lookups)
SELECT ID_, DEPLOYMENT_ID_ FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_='orderEvent' AND VERSION_=1;
-- after: keep exactly one
DELETE FROM FLW_EV_DATABASE_DEFINITION WHERE KEY_='orderEvent' AND VERSION_=1 AND ID_ != '<kept-id>';
Defensive patterns

Strategy: validation

Validate before calling

long n = eventRepositoryService.createEventDefinitionQuery()
    .eventDefinitionKey(key).eventDefinitionVersion(version).count();
if (n > 1) throw new IllegalStateException("duplicate event definitions for key " + key + " v" + version + ", clean DB before lookup");

Try / catch

try {
    def = manager.findEventDefinitionByKeyAndVersion(key, version);
} catch (FlowableException e) {
    def = dedupeAndRetry(key, version); // delete extra rows, then retry
}

Prevention

When it happens

Trigger: Two or more FLW_EV_DATABASE_DEFINITION rows with identical KEY_ and VERSION_ — usually caused by concurrent deployments of the same event model on separate cluster nodes.

Common situations: Cluster nodes bootstrapping the same event definitions at the same time; missing unique index on (KEY_, VERSION_); migration scripts executed twice; retries re-inserting definitions after timeouts.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


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

Appendix: source

Thrown at modules/flowable-event-registry/src/main/java/org/flowable/eventregistry/impl/persistence/entity/data/impl/MybatisEventDefinitionDataManager.java:120

    public EventDefinitionEntity findEventDefinitionByDeploymentAndKeyAndTenantId(String deploymentId, String eventDefinitionKey, String tenantId) {
        Map<String, Object> parameters = new HashMap<>();
        parameters.put("deploymentId", deploymentId);
        parameters.put("eventDefinitionKey", eventDefinitionKey);
        parameters.put("tenantId", tenantId);
        return (EventDefinitionEntity) getDbSqlSession().selectOne("selectEventDefinitionByDeploymentAndKeyAndTenantId", parameters);
    }
    
    @Override
    @SuppressWarnings("unchecked")
    public EventDefinitionEntity findEventDefinitionByKeyAndVersion(String eventDefinitionKey, Integer eventVersion) {
        Map<String, Object> params = new HashMap<>();
        params.put("eventDefinitionKey", eventDefinitionKey);
        params.put("eventVersion", eventVersion);
        List<EventDefinitionEntity> results = getDbSqlSession().selectList("selectEventDefinitionsByKeyAndVersion", params);
        if (results.size() == 1) {
            return results.get(0);
        } else if (results.size() > 1) {
            throw new FlowableException("There are " + results.size() + " event definitions with key = '" + eventDefinitionKey + "' and version = '" + eventVersion + "'.");
        }
        return null;
    }

    @Override
    @SuppressWarnings("unchecked")
    public EventDefinitionEntity findEventDefinitionByKeyAndVersionAndTenantId(String eventDefinitionKey, Integer eventVersion, String tenantId) {
        Map<String, Object> params = new HashMap<>();
        params.put("eventDefinitionKey", eventDefinitionKey);
        params.put("eventVersion", eventVersion);
        params.put("tenantId", tenantId);
        List<EventDefinitionEntity> results = getDbSqlSession().selectList("selectEventDefinitionsByKeyAndVersionAndTenantId", params);
        if (results.size() == 1) {
            return results.get(0);
        } else if (results.size() > 1) {
            throw new FlowableException("There are " + results.size() + " event definitions with key = '" + eventDefinitionKey + "' and version = '" + eventVersion + "' in tenant = '" + tenantId + "'.");
        }
        return null;

View on GitHub (pinned to d6d39ce1c6)