/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.communication.routing;
import java.util.List;
import de.rcenvironment.core.communication.common.NetworkGraphLink;
import de.rcenvironment.core.communication.common.InstanceNodeSessionId;
import de.rcenvironment.core.communication.model.NetworkRequest;
import de.rcenvironment.core.communication.model.NetworkResponse;
import de.rcenvironment.core.communication.transport.spi.MessageChannel;
/**
* A service for performing request/response calls to remote nodes, routing across intermediate nodes if necessary.
*
* @author Robert Mischke
*/
public interface MessageRoutingService {
/**
* Performs a {@link NetworkRequest} to a remote node and returns a {@link NetworkResponse}, using the default timeout. The destination
* node does not have to be adjacent within the network; messages are routed across other nodes if necessary.
*
* @param payload the serialized message body to transport to the destination
* @param messageType the message type id; see {@link ProtocolConstants}
* @param receiver the final recipient's node id.
* @return the {@link NetworkResponse}
*/
NetworkResponse performRoutedRequest(byte[] payload, String messageType, InstanceNodeSessionId receiver);
/**
* Performs a {@link NetworkRequest} to a remote node and returns a {@link NetworkResponse}, using a custom timeout. The destination
* node does not have to be adjacent within the network; messages are routed across other nodes if necessary.
*
* @param payload the serialized message body to transport to the destination
* @param messageType the message type id; see {@link ProtocolConstants}
* @param receiver the final recipient's node id.
* @param timeoutMsec the timeout in msec
* @return the {@link NetworkResponse}
*/
NetworkResponse performRoutedRequest(byte[] payload, String messageType, InstanceNodeSessionId receiver, int timeoutMsec);
/**
* Sends the given request towards the destination node contained in its metadata. The request is not modified anymore; this method only
* determines the proper {@link MessageChannel} to use and performs the request.
*
* @param forwardingRequest the ready-to-send forwarding request
* @return the {@link NetworkResponse} resulting from the request
*/
NetworkResponse forwardAndAwait(NetworkRequest forwardingRequest);
/**
* Determines the shortest/cheapest route to the given node, or null if the target node is unreachable.
*
* @param destination the node to find a route to
* @return the generated route, or null if no route could be constructed
*/
List<? extends NetworkGraphLink> getRouteTo(InstanceNodeSessionId destination);
}