in solutions/solution-basic/src/main/java/org/apache/servicecomb/solution/basic/health/HealthInstancePing.java [58:105]
public boolean ping(StatefulDiscoveryInstance instance) {
if (CollectionUtils.isEmpty(instance.getEndpoints())) {
return false;
}
// hard coded here, not very nice
if ("local-registry".equals(instance.getRegistryName())) {
return telnetInstancePing.ping(instance);
}
Map<String, Object> args = new HashMap<>(2);
args.put("instanceId", instance.getInstanceId());
args.put("registryName", instance.getRegistryName());
for (String endpoint : instance.getEndpoints()) {
URI uri = URI.create(endpoint);
String transportName = uri.getScheme();
Transport transport = scbEngine.getTransportManager().findTransport(transportName);
if (transport == null) {
continue;
}
Invocation invocation = InvokerUtils.createInvocation(instance.getServiceName(), transportName,
"HealthEndpoint", "health",
args, boolean.class);
invocation.setEndpoint(new Endpoint(transport, endpoint, instance));
boolean result;
try {
result = (boolean) InvokerUtils.syncInvoke(invocation);
} catch (Exception e) {
LOGGER.warn("ping instance {}/{}/{}/{} endpoint {} failed. {}",
instance.getApplication(),
instance.getServiceName(),
instance.getRegistryName(),
instance.getInstanceId(), endpoint, e.getMessage());
continue;
}
if (result) {
return true;
}
LOGGER.warn("ping instance {}/{}/{}/{} endpoint {} failed",
instance.getApplication(),
instance.getServiceName(),
instance.getRegistryName(),
instance.getInstanceId(), endpoint);
}
return false;
}