You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@dubbo.apache.org by "lichunheng1024 (GitHub)" <gi...@apache.org> on 2019/12/21 15:33:42 UTC

[GitHub] [dubbo] lichunheng1024 commented on issue #4749: Address already in use: bind


让用户配置一个负数,去触发走默认值+主动bind校验的逻辑,增加了用户的使用成本。
用户也会疑惑,端口号还能配负数嘛。



下面这种优化思路-尽力避免 "Address already in use"  的出现,请指正


#### com.alibaba.dubbo.config.ServiceConfig#findConfigedPorts
```java
private Integer findConfigedPorts(ProtocolConfig protocolConfig, String name, Map<String, String> map) {
        Integer portToBind = null;

        // parse bind port from environment
        String port = getValueFromConfig(protocolConfig, Constants.DUBBO_PORT_TO_BIND);
        portToBind = parsePort(port);

        // if there's no bind port found from environment, keep looking up.
        if (portToBind == null) {
            portToBind = protocolConfig.getPort();
            if (provider != null && (portToBind == null || portToBind == 0)) {
                portToBind = provider.getPort();
            }
        }
        if(portToBind <= 0){
            portToBind = ExtensionLoader.getExtensionLoader(Protocol.class).getExtension(name).getDefaultPort();
        }
        portToBind=getAvailablePort(portToBind);
        // save bind port, used as url's key later
        map.put(Constants.BIND_PORT_KEY, String.valueOf(portToBind));
       
        // registry port, not used as bind port by default
        String portToRegistryStr = getValueFromConfig(protocolConfig, Constants.DUBBO_PORT_TO_REGISTRY);
        Integer portToRegistry = parsePort(portToRegistryStr);
        if (portToRegistry == null) {
            portToRegistry = portToBind;
        }
        return portToRegistry;
    }


```
####  com.alibaba.dubbo.common.utils.NetUtils#getAvailablePort
```

   public static int getAvailablePort(int port) {
        for (int i = port; i < MAX_PORT; i++) {
            ServerSocket ss = null;
            try {
                ss = new ServerSocket(i);
                return i;
            } catch (IOException e) {
                // continue
            } finally {
                if (ss != null) {
                    try {
                        ss.close();
                    } catch (IOException e) {
                    }
                }
            }
        }
        return getAvailablePort();
    }

```





[ Full content available at: https://github.com/apache/dubbo/issues/4749 ]
This message was relayed via gitbox.apache.org for notifications@dubbo.apache.org