让用户配置一个负数,触发`getRandomPort(String protocol) `,该方法第一次返回Integer.MIN_VALUE;
从而进入`getAvailablePort(int port)` ,该方法被`findConfigedPorts`调用时传入的是默认值
20880,从而执行主动探测port是否可用的。并不会执行到无参的`getAvailablePort() `
若用户没配置负数,则触发不了主动探测的`getAvailablePort`逻辑。
另外没懂 `getRandomPort(name)` 和 `putRandomPort()` 的用途。
尽力避免 "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
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]