{"record":{"id":"45382c9549c1fcd6","repo":"apache/dubbo","slug":"duplicated-port-used-by-protocol-configs-port-p","errorCode":null,"errorMessage":"Duplicated port used by protocol configs, port: <port>, configs: <Arrays.asList(prevProtocol, protocol)>","messagePattern":"Duplicated port used by protocol configs, port: <port>, configs: <Arrays\\.asList\\(prevProtocol, protocol\\)>","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java","lineNumber":349,"sourceCode":"                MonitorConfig.class,\n                MetricsConfig.class,\n                TracingConfig.class,\n                SslConfig.class);\n\n        for (Class<? extends AbstractConfig> configType : multipleConfigTypes) {\n            checkDefaultAndValidateConfigs(configType);\n        }\n\n        // check port conflicts\n        Map<Integer, ProtocolConfig> protocolPortMap = new LinkedHashMap<>();\n        for (ProtocolConfig protocol : getProtocols()) {\n            Integer port = protocol.getPort();\n            if (port == null || port == -1) {\n                continue;\n            }\n            ProtocolConfig prevProtocol = protocolPortMap.get(port);\n            if (prevProtocol != null) {\n                throw new IllegalStateException(\"Duplicated port used by protocol configs, port: \" + port\n                        + \", configs: \" + Arrays.asList(prevProtocol, protocol));\n            }\n            protocolPortMap.put(port, protocol);\n        }\n\n        // Log the current configurations.\n        logger.info(\"The current configurations or effective configurations are as follows:\");\n        for (Class<? extends AbstractConfig> configType : multipleConfigTypes) {\n            getConfigs(configType).forEach((config) -> logger.info(config.toString()));\n        }\n    }\n\n    public ConfigMode getConfigMode() {\n        return configMode;\n    }\n}\n","sourceCodeStart":331,"sourceCodeEnd":366,"githubUrl":"https://github.com/apache/dubbo/blob/3a3043227f5571d25eb2889de5bca22f2914843b/dubbo-common/src/main/java/org/apache/dubbo/config/context/ConfigManager.java#L331-L366","documentation":"Thrown by ConfigManager during the final port-conflict check: two ProtocolConfig instances declare the same non-null, non-(-1) port. Dubbo binds each protocol to its port, so a collision would prevent startup; the check lists both conflicting configs. Ports of null or -1 are auto-assigned and skipped.","triggerScenarios":"Two <dubbo:protocol> beans with the same port (e.g. two REST protocols on 8080, or dubbo and rest both pinned to 20880). Programmatic ProtocolConfig with colliding setPort().","commonSituations":"Adding a second protocol and reusing an existing port. Spring Boot properties dubbo.protocols.<id>.port colliding. Copy-pasting a protocol config without changing the port.","solutions":["Assign distinct ports to each protocol.","Omit the port (or set -1) to let Dubbo auto-assign for protocols that support it.","Remove a duplicate protocol config that is no longer needed."],"exampleFix":"<!-- before -->\n<dubbo:protocol name=\"dubbo\" port=\"20880\"/>\n<dubbo:protocol name=\"rest\" port=\"20880\"/>\n<!-- after -->\n<dubbo:protocol name=\"dubbo\" port=\"20880\"/>\n<dubbo:protocol name=\"rest\" port=\"8080\"/>","handlingStrategy":"validation","validationCode":"// Pre-check port collisions among protocol configs\nMap<Integer, ProtocolConfig> seen = new HashMap<>();\nfor (ProtocolConfig p : configManager.getProtocols()) {\n    Integer port = p.getPort();\n    if (port == null || port == -1) continue;\n    if (seen.containsKey(port)) {\n        throw new IllegalStateException(\"Port collision on \" + port + \" between \" + seen.get(port) + \" and \" + p);\n    }\n    seen.put(port, p);\n}\nconfigManager.getDefaultConfiguration(); // triggers validation","typeGuard":"static boolean noProtocolPortCollisions(List<ProtocolConfig> protocols) {\n    java.util.Set<Integer> ports = new java.util.HashSet<>();\n    for (ProtocolConfig p : protocols) {\n        Integer port = p.getPort();\n        if (port == null || port == -1) continue;\n        if (!ports.add(port)) return false;\n    }\n    return true;\n}","tryCatchPattern":"try {\n    configManager.getDefaultConfiguration();\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"Duplicated port used by protocol configs\")) {\n        // parse port, reassign one of the conflicting protocols\n    } else throw e;\n}","preventionTips":["Assign distinct ports per protocol in config.","Use -1 or omit port for auto-assignment where supported.","Add a startup assertion that protocol ports are unique."],"tags":["config","protocol","port-conflict","startup"],"backgroundTag":null,"analyzedSha":"3a3043227f5571d25eb2889de5bca22f2914843b","analyzedAt":"2026-08-14T00:43:19.853Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}