package com.sequenceiq.cloudbreak.service.registry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RetryingServiceAddressResolver implements ServiceAddressResolver {
private static final Logger LOGGER = LoggerFactory.getLogger(RetryingServiceAddressResolver.class);
private static final int SLEEPTIME = 2000;
private ServiceAddressResolver serviceAddressResolver;
private int maxRetryCount;
public RetryingServiceAddressResolver(ServiceAddressResolver serviceAddressResolver, int timeoutInMillis) {
this.serviceAddressResolver = serviceAddressResolver;
maxRetryCount = timeoutInMillis / SLEEPTIME;
if (maxRetryCount <= 0) {
maxRetryCount = 1;
}
}
@Override
public String resolveUrl(String serverUrl, String protocol, String serviceId) throws ServiceAddressResolvingException {
int attemptCount = 0;
String resolvedAddress = null;
while (resolvedAddress == null && attemptCount < maxRetryCount) {
try {
resolvedAddress = serviceAddressResolver.resolveUrl(serverUrl, protocol, serviceId);
} catch (ServiceAddressResolvingException e) {
handleException(e, attemptCount);
}
attemptCount++;
}
return resolvedAddress;
}
@Override
public String resolveHostPort(String host, String port, String serviceId) throws ServiceAddressResolvingException {
int attemptCount = 0;
String resolvedAddress = null;
while (resolvedAddress == null && attemptCount < maxRetryCount) {
try {
resolvedAddress = serviceAddressResolver.resolveHostPort(host, port, serviceId);
} catch (ServiceAddressResolvingException e) {
handleException(e, attemptCount);
}
attemptCount++;
}
return resolvedAddress;
}
private void handleException(ServiceAddressResolvingException e, int attemptCount) throws ServiceAddressResolvingException {
if (attemptCount == maxRetryCount - 1) {
throw e;
} else {
try {
LOGGER.warn("Unsuccessful address resolving: {}, retrying in {}millis", e.getMessage(), SLEEPTIME);
Thread.sleep(SLEEPTIME);
} catch (InterruptedException ie) {
LOGGER.warn("Interrupted exception occurred.", ie.getMessage());
}
}
}
}