![JAR search and dependency download from the Maven repository](/logo.png)
org.nustaq.kontraktor.services.ServiceRegistry Maven / Gradle / Ivy
package org.nustaq.kontraktor.services;
import com.beust.jcommander.JCommander;
import org.nustaq.kontraktor.Actor;
import org.nustaq.kontraktor.Actors;
import org.nustaq.kontraktor.Callback;
import org.nustaq.kontraktor.IPromise;
import org.nustaq.kontraktor.annotations.Local;
import org.nustaq.kontraktor.remoting.tcp.TCPNIOPublisher;
import org.nustaq.kontraktor.util.Log;
import org.nustaq.kontraktor.util.Pair;
import org.nustaq.reallive.api.Record;
import org.nustaq.reallive.messages.AddMessage;
import org.nustaq.reallive.messages.QueryDoneMessage;
import org.nustaq.reallive.messages.RemoveMessage;
import org.nustaq.reallive.messages.UpdateMessage;
import org.nustaq.reallive.records.MapRecord;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Created by ruedi on 11.08.2015.
*
* a simple service registry. Services can be registered by name.
* They are expected to send cyclical heartbeats.
* By registering a listener (callback) remote services can listen to
* availability/unavailability of services
*
* Rationale: in cluster of services managing connectivity gets complex
* quickly. In order to simplify this, services are given a single point
* of contact: the service registry (gravity). They register themself and
* obtain address and availability from the central registry.
* Note: Downside is, this is a SPOF.
*/
public class ServiceRegistry extends Actor {
public static final String CONFIGUPDATE = "configupdate";
public static final String SERVICEDUMP = "running";
public static final String AVAILABLE = "available";
public static final String TIMEOUT = "timeout";
public static Class JSONCLASSES[] = {
AddMessage.class, RemoveMessage.class, UpdateMessage.class, QueryDoneMessage.class, Record.class, MapRecord.class,
};
HashMap> services;
List listeners;
ClusterCfg config;
@Local
public void init() {
services = new HashMap<>();
listeners = new ArrayList<>();
checkTimeout();
config = ClusterCfg.read();
serviceDumper();
}
public void serviceDumper() {
if ( ! isStopped() ) {
try {
Log.Info(this, "------");
services.forEach((k, sd) -> Log.Info(this,""+sd) );
Log.Info(this, "------");
listeners.forEach( cb -> {
cb.pipe(new Pair(SERVICEDUMP, services));
});
if ( ClusterCfg.isDirty() ) {
config = ClusterCfg.read();
listeners.forEach(cb -> cb.pipe(new Pair(CONFIGUPDATE, config)));
}
} catch (Exception e) {
Log.Error(this,e);
}
delayed(10000, () -> serviceDumper());
}
}
public void registerService( ServiceDescription desc ) {
List serviceList = getServiceList(desc.getName());
serviceList.add(desc);
desc.receiveHeartbeat();
if (serviceList.size()==1)
broadcastAvailable(desc);
}
public IPromise
© 2015 - 2025 Weber Informatics LLC | Privacy Policy