{"record":{"id":"7830b28cf5e4f7cf","repo":"aeron-io/aeron","slug":"aeronarchive-context-controlresponsechannel-must-be-set","errorCode":null,"errorMessage":"AeronArchive.Context.controlResponseChannel must be set","messagePattern":"AeronArchive\\.Context\\.controlResponseChannel must be set","errorType":"validation","errorClass":"ConfigurationException","httpStatus":null,"severity":"error","filePath":"aeron-archive/src/main/java/io/aeron/archive/client/AeronArchive.java","lineNumber":3100,"sourceCode":"\n        /**\n         * Conclude configuration by setting up defaults when specifics are not provided.\n         */\n        public void conclude()\n        {\n            if ((boolean)IS_CONCLUDED_VH.getAndSet(this, true))\n            {\n                throw new ConcurrentConcludeException();\n            }\n\n            if (null == controlRequestChannel)\n            {\n                throw new ConfigurationException(\"AeronArchive.Context.controlRequestChannel must be set\");\n            }\n\n            if (null == controlResponseChannel)\n            {\n                throw new ConfigurationException(\"AeronArchive.Context.controlResponseChannel must be set\");\n            }\n\n            if (clientName.length() > Aeron.Configuration.MAX_CLIENT_NAME_LENGTH)\n            {\n                throw new ConfigurationException(\n                    \"AeronArchive.Context.clientName length must be <= \" + Aeron.Configuration.MAX_CLIENT_NAME_LENGTH);\n            }\n\n            if (messageRetryAttempts <= 0)\n            {\n                throw new ConfigurationException(\"AeronArchive.Context.messageRetryAttempts must be > 0, got: \" +\n                    messageRetryAttempts);\n            }\n\n            if (null == aeron)\n            {\n                aeron = Aeron.connect(\n                    new Aeron.Context()","sourceCodeStart":3082,"sourceCodeEnd":3118,"githubUrl":"https://github.com/aeron-io/aeron/blob/6d60124e15e35c11b49ba2e3c2c2858a09a18803/aeron-archive/src/main/java/io/aeron/archive/client/AeronArchive.java#L3082-L3118","documentation":"AeronArchive.Context.conclude() requires the controlResponseChannel — the subscription URI on which the client receives archive replies. When it is null after conclusion-time validation, ConfigurationException with this message is thrown before any connection is attempted.","triggerScenarios":"connect() with a Context that has controlRequestChannel set but controlResponseChannel(String) never called, or a null value passed explicitly.","commonSituations":"Setting only the request channel by mistake; migration from older code/config that used a different property name; environment property missing so the setter was never invoked.","solutions":["Set ctx.controlResponseChannel(\"aeron:udp?endpoint=<client-host>:<response-port>\") before connect().","Or set the system property io.aeron.archive.client.control.response.channel.","Ensure the response channel endpoint/port are routable from the client to the archive's control response stream.","Log the context values in a startup check to catch missing configuration early."],"exampleFix":"// before\nctx.controlRequestChannel(\"aeron:udp?endpoint=localhost:8010\");\n// after\nctx.controlRequestChannel(\"aeron:udp?endpoint=localhost:8010\")\n   .controlResponseChannel(\"aeron:udp?endpoint=localhost:8020\");","handlingStrategy":"validation","validationCode":"if (ctx.controlResponseChannel() == null) { throw new IllegalArgumentException(\"controlResponseChannel required\"); }","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set the response channel before calling connect(); treat it as mandatory config.","Load AeronArchive.Configuration defaults and verify them at startup.","Use distinct response endpoint ports per client to avoid collisions.","Keep context setup in one reviewed code path, not scattered setters."],"tags":["aeron","archive","configuration","missing-channel"],"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"}