All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zodiac.eureka.client.AppEurekaClient Maven / Gradle / Ivy

There is a newer version: 1.6.8
Show newest version
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