package io.scalecube.services; import static io.scalecube.services.ServiceHeaders.serviceMethod; import static io.scalecube.services.ServiceHeaders.serviceRequest; import io.scalecube.cluster.Cluster; import io.scalecube.transport.Message; import java.util.Optional; public class ServiceDispatcher { private final Cluster cluster; private final ServiceRegistry registry; /** * ServiceDispatcher constructor to listen on incoming network service request. * * @param cluster instance to listen on events. * @param registry service registry instance for dispatching. */ public ServiceDispatcher(Cluster cluster, ServiceRegistry registry) { this.cluster = cluster; this.registry = registry; // Start listen messages cluster.listen() .filter(message -> serviceRequest(message) != null) .subscribe(this::onServiceRequest); } private void onServiceRequest(final Message request) { Optional<ServiceInstance> serviceInstance = registry.getLocalInstance(serviceRequest(request), serviceMethod(request)); DispatchingFuture result = DispatchingFuture.from(cluster, request); try { if (serviceInstance.isPresent()) { result.complete(serviceInstance.get().invoke(request)); } else { result.completeExceptionally(new IllegalStateException("Service instance is missing: " + request.qualifier())); } } catch (Exception ex) { result.completeExceptionally(ex); } } }