public static boolean validateInstanceEndpoint(String endpoint) {
return INST_ENDPOINT_PATTERN.matcher(endpoint).matches();
}
public static String parseInstanceIdFromEndpoint(String endpoint) {
if (StringUtils.isEmpty(endpoint)) {
return null;
}
return endpoint.substring(endpoint.lastIndexOf("/") + 1, endpoint.indexOf('.'));
}
public static String getNameSrvAddrFromNamesrvEndpoint(String nameSrvEndpoint) {
if (StringUtils.isEmpty(nameSrvEndpoint)) {
return null;
}
return nameSrvEndpoint.substring(nameSrvEndpoint.lastIndexOf('/') + 1);
}
这个类不大,把剩余的方法也看下。第一个是校验endpoint这个字符串是否符合规范。第二个是从endpoint中取出实例id,第三个是从nameSrvEndpoint中取出NameSrv的地址,但由于对endpoint的规范格式还不清楚,所以先遗留这个问题,继续往后看。
回到ClientConfig,第三行涉及到一个网络工具RemotingUtil:
org.apache.rocketmq.remoting.common.RemotingUtil
public static final String OS_NAME = System.getProperty("os.name");
private static final InternalLogger log = InternalLoggerFactory.getLogger(RemotingHelper.ROCKETMQ_REMOTING);
private static boolean isLinuxPlatform = false;
private static boolean isWindowsPlatform = false;
static {
if (OS_NAME != null && OS_NAME.toLowerCase().contains("linux")) {
isLinuxPlatform = true;
}
if (OS_NAME != null && OS_NAME.toLowerCase().contains("windows")) {
isWindowsPlatform = true;
}
}
进来之后首先是一个静态代码块,判断了当前的环境。我也写了个测试类,看看自己本地环境是啥:
@Test
public void test21(){
String OS_NAME = System.getProperty("os.name");
System.out.println(OS_NAME);
// Mac OS X
}
结果的话显示是Mac OS X,好像既不属于linux也不属于windows,哈哈,不知道RocketMq底层还有没有对mac做兼容。。
接下来看下
public static Selector openSelector()
这个方法
if (isLinuxPlatform()) {
try {
final Class<?> providerClazz = Class.forName("sun.nio.ch.EPollSelectorProvider");
if (providerClazz != null) {
try {
final Method method = providerClazz.getMethod("provider");
if (method != null) {
final SelectorProvider selectorProvider = (SelectorProvider) method.invoke(null);
if (selectorProvider != null) {
result = selectorProvider.openSelector();
}
}
} catch (final Exception e) {
log.warn("Open ePoll Selector for linux platform exception", e);
}
}
} catch (final Exception e) {
// ignore
}
}