org.zodiac.eureka.client.AppEurekaClient Maven / Gradle / Ivy
package org.zodiac.eureka.client;
import java.lang.reflect.Field;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.zodiac.core.event.discovery.AppHeartbeatEvent;
import org.zodiac.sdk.toolkit.util.ReflectionUtil;
import com.netflix.appinfo.ApplicationInfoManager;
import com.netflix.appinfo.InstanceInfo;
import com.netflix.appinfo.InstanceInfo.InstanceStatus;
import com.netflix.discovery.AbstractDiscoveryClientOptionalArgs;
import com.netflix.discovery.DiscoveryClient;
import com.netflix.discovery.EurekaClientConfig;
import com.netflix.discovery.shared.resolver.EndpointRandomizer;
import com.netflix.discovery.shared.transport.EurekaHttpClient;
import com.netflix.discovery.shared.transport.EurekaHttpResponse;
public class AppEurekaClient extends DiscoveryClient {
private static final Logger log = LoggerFactory.getLogger(AppEurekaClient.class);
private final AtomicLong cacheRefreshedCount = new AtomicLong(0);
private ApplicationEventPublisher publisher;
private Field eurekaTransportField;
private ApplicationInfoManager applicationInfoManager;
private volatile AtomicReference eurekaHttpClientRef = new AtomicReference<>();
public AppEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config,
AbstractDiscoveryClientOptionalArgs args, EndpointRandomizer randomizer, ApplicationEventPublisher publisher) {
super(applicationInfoManager, config, args, randomizer);
this.applicationInfoManager = applicationInfoManager;
this.publisher = publisher;
this.eurekaTransportField = ReflectionUtil.findField(DiscoveryClient.class, "eurekaTransport");
ReflectionUtil.makeAccessible(this.eurekaTransportField);
}
public AppEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config,
AbstractDiscoveryClientOptionalArgs args, ApplicationEventPublisher publisher) {
super(applicationInfoManager, config, args);
this.applicationInfoManager = applicationInfoManager;
this.publisher = publisher;
this.eurekaTransportField = ReflectionUtil.findField(DiscoveryClient.class, "eurekaTransport");
ReflectionUtil.makeAccessible(this.eurekaTransportField);
}
public AppEurekaClient(ApplicationInfoManager applicationInfoManager, EurekaClientConfig config,
ApplicationEventPublisher publisher) {
super(applicationInfoManager, config);
this.applicationInfoManager = applicationInfoManager;
this.publisher = publisher;
this.eurekaTransportField = ReflectionUtil.findField(DiscoveryClient.class, "eurekaTransport");
ReflectionUtil.makeAccessible(this.eurekaTransportField);
}
public ApplicationInfoManager getApplicationInfoManager() {
return applicationInfoManager;
}
public InstanceInfo getInstanceInfo(String appname, String instanceId) {
EurekaHttpResponse response = getEurekaRegistrationHttpClient().getInstance(appname, instanceId);
HttpStatus httpStatus = HttpStatus.valueOf(response.getStatusCode());
if (httpStatus.is2xxSuccessful() && response.getEntity() != null) {
return response.getEntity();
}
return null;
}
public void setStatus(InstanceStatus newStatus, InstanceInfo info) {
getEurekaRegistrationHttpClient().statusUpdate(info.getAppName(), info.getId(), newStatus, info);
}
public void cancelOverrideStatus(InstanceInfo info) {
getEurekaRegistrationHttpClient().deleteStatusOverride(info.getAppName(), info.getId(), info);
}
public EurekaHttpClient registrationEurekaHttpClient() {
return getEurekaRegistrationHttpClient();
}
@Override
protected void onCacheRefreshed() {
super.onCacheRefreshed();
/*Might be called during construction and.*/
if (this.cacheRefreshedCount != null) {
/*Will be null.*/
long newCount = this.cacheRefreshedCount.incrementAndGet();
log.trace("onCacheRefreshed called with count: {}", newCount);
this.publisher.publishEvent(new AppHeartbeatEvent(this, newCount));
}
}
EurekaHttpClient getEurekaRegistrationHttpClient() {
if (this.eurekaHttpClientRef.get() == null) {
try {
Object eurekaTransport = this.eurekaTransportField.get(this);
Field registrationClientField =
ReflectionUtil.findField(eurekaTransport.getClass(), "registrationClient");
ReflectionUtil.makeAccessible(registrationClientField);
this.eurekaHttpClientRef.compareAndSet(null,
(EurekaHttpClient)registrationClientField.get(eurekaTransport));
} catch (IllegalAccessException e) {
log.error("Error getting EurekaHttpClient", e);
}
}
return this.eurekaHttpClientRef.get();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy