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