{"record":{"id":"1f3ae0c5a0eb11c5","repo":"aeron-io/aeron","slug":"controlledegresslistener-must-be-specified-on-aeroncluster","errorCode":null,"errorMessage":"controlledEgressListener must be specified on AeronCluster.Context","messagePattern":"controlledEgressListener must be specified on AeronCluster\\.Context","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-cluster/src/main/java/io/aeron/cluster/client/AeronCluster.java","lineNumber":1547,"sourceCode":"                credentialsSupplier = new NullCredentialsSupplier();\n            }\n\n            if (null == egressListener)\n            {\n                egressListener =\n                    (clusterSessionId, timestamp, buffer, offset, length, header) ->\n                    {\n                        throw new ConfigurationException(\n                            \"egressListener must be specified on AeronCluster.Context\");\n                    };\n            }\n\n            if (null == controlledEgressListener)\n            {\n                controlledEgressListener =\n                    (clusterSessionId, timestamp, buffer, offset, length, header) ->\n                    {\n                        throw new ConfigurationException(\n                            \"controlledEgressListener must be specified on AeronCluster.Context\");\n                    };\n            }\n        }\n\n        /**\n         * Has the context had the {@link #conclude()} method called.\n         *\n         * @return true if the {@link #conclude()} method has been called.\n         */\n        public boolean isConcluded()\n        {\n            return isConcluded;\n        }\n\n        /**\n         * Set the message timeout in nanoseconds to wait for sending or receiving a message.\n         *","sourceCodeStart":1529,"sourceCodeEnd":1565,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-cluster/src/main/java/io/aeron/cluster/client/AeronCluster.java#L1529-L1565","documentation":"Context.conclude() installs a placeholder controlledEgressListener that throws ConfigurationException when none was supplied. The controlled listener offers backpressured, poll-style handling of cluster responses; without a real implementation the library refuses to silently drop egress events.","triggerScenarios":"Connecting an AeronCluster without calling ctx.controlledEgressListener(...) (and without a plain egressListener covering the path), then polling egress so the placeholder is invoked.","commonSituations":"Applications that register only the simple egressListener but poll via the controlled path (or vice versa); generated/config-driven Context setup missing the callback.","solutions":["Set ctx.controlledEgressListener((clusterSessionId, timestamp, buffer, offset, length, header) -> ...) before connect()","Or set a plain egressListener if you prefer fire-and-forget semantics and that is the installed default","Provide a no-op ControlledEgressListener if responses are intentionally ignored"],"exampleFix":"// before\nctx.egressListener((s, t, b, o, l, h) -> handle(b, o, l)); // controlled listener missing\n// after\nctx.egressListener((s, t, b, o, l, h) -> handle(b, o, l))\n   .controlledEgressListener((s, t, b, o, l, h) -> { handle(b, o, l); return l; });","handlingStrategy":"validation","validationCode":"if (ctx.controlledEgressListener() == null && ctx.egressListener() == null) {\n    throw new IllegalArgumentException(\"provide controlledEgressListener or egressListener before connect()\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Register both listener styles explicitly in shared bootstrap code","Document in your client wrapper that listeners are mandatory"],"tags":["configuration","callback","cluster-client"],"backgroundTag":"missing-required-config-field","analyzedSha":"6d60124e15e35c11b49ba2e3c2c2858a09a18803","analyzedAt":"2026-09-12T11:17:07.683Z","contentChangedAt":"2026-09-12T11:17:07.683Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}