Class AbstractRPCService

  • All Implemented Interfaces:
    RPCService, org.jgroups.blocks.RequestHandler, org.jgroups.MembershipListener, org.picocontainer.Startable
    Direct Known Subclasses:
    RPCServiceImpl

    public abstract class AbstractRPCService
    extends Object
    implements RPCService, org.picocontainer.Startable, org.jgroups.blocks.RequestHandler, org.jgroups.MembershipListener
    This class is a basic implementation of the RPCService, it is mainly based on the MessageDispatcher of JGroups. This implementation is not designed to give the best possible performances, it only aims to give a way to communicate with other nodes.
    Version:
    $Id$
    Author:
    Nicolas Filotto
    • Field Detail

      • LOG

        protected static final org.exoplatform.services.log.Log LOG
        Connection logger.
      • PARAM_JGROUPS_CONFIG

        protected static final String PARAM_JGROUPS_CONFIG
        The name of the parameter for the location of the JGroups configuration.
        See Also:
        Constant Field Values
      • PARAM_CLUSTER_NAME

        protected static final String PARAM_CLUSTER_NAME
        The name of the parameter for the name of the cluster.
        See Also:
        Constant Field Values
      • PARAM_DEFAULT_TIMEOUT

        protected static final String PARAM_DEFAULT_TIMEOUT
        The name of the parameter for the default timeout
        See Also:
        Constant Field Values
      • PARAM_ALLOW_FAILOVER

        protected static final String PARAM_ALLOW_FAILOVER
        The name of the parameter to allow the failover
        See Also:
        Constant Field Values
      • PARAM_RETRY_TIMEOUT

        protected static final String PARAM_RETRY_TIMEOUT
        The name of the parameter for the retry timeout
        See Also:
        Constant Field Values
      • DEFAULT_TIMEOUT

        protected static final int DEFAULT_TIMEOUT
        The value of the default timeout
        See Also:
        Constant Field Values
      • DEFAULT_RETRY_TIMEOUT

        protected static final int DEFAULT_RETRY_TIMEOUT
        The value of the default retry timeout
        See Also:
        Constant Field Values
      • configurator

        protected final org.jgroups.conf.ProtocolStackConfigurator configurator
        The configurator used to create the JGroups Channel
      • channel

        protected org.jgroups.Channel channel
        The JGroups Channel used to communicate with other nodes
      • members

        protected volatile List<org.jgroups.Address> members
        The current list of all the members of the cluster
      • coordinator

        protected volatile org.jgroups.Address coordinator
        The address of the current coordinator
      • isCoordinator

        protected volatile boolean isCoordinator
        Indicates whether the current node is the coordinator of the cluster or not
      • dispatcher

        protected org.jgroups.blocks.MessageDispatcher dispatcher
        The dispatcher used to launch the command of the cluster nodes
    • Constructor Detail

      • AbstractRPCService

        public AbstractRPCService​(org.exoplatform.container.ExoContainerContext ctx,
                                  org.exoplatform.container.xml.InitParams params,
                                  org.exoplatform.container.configuration.ConfigurationManager configManager)
        The public constructor
        Parameters:
        ctx - the ExoContainerContext from which we will extract the corresponding ExoContainer
        params - the list of initial parameters
        configManager - the configuration manager used to get the configuration of JGroups
    • Method Detail

      • executeCommandOnAllNodes

        public List<Object> executeCommandOnAllNodes​(RemoteCommand command,
                                                     boolean synchronous,
                                                     Serializable... args)
                                              throws RPCException
        Executes a command on all the cluster nodes. This method is equivalent to the other method of the same type but with the default timeout. The command must be registered first otherwise an RPCException will be thrown.
        Specified by:
        executeCommandOnAllNodes in interface RPCService
        Parameters:
        command - The command to execute on each cluster node
        synchronous - if true, sets group request mode to org.jgroups.blocks.GroupRequest#GET_ALL, and if false sets it to org.jgroups.blocks.GroupRequest#GET_NONE.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        a list of responses from all the members of the cluster. If we met an exception on a given node, the RPCException will be the corresponding response of this particular node
        Throws:
        RPCException - in the event of problems.
      • executeCommandOnAllNodes

        public List<Object> executeCommandOnAllNodes​(RemoteCommand command,
                                                     long timeout,
                                                     Serializable... args)
                                              throws RPCException
        Executes a command synchronously on all the cluster nodes. The command must be registered first otherwise an RPCException will be thrown.
        Specified by:
        executeCommandOnAllNodes in interface RPCService
        Parameters:
        command - The command to execute on each cluster node
        timeout - a timeout after which to throw a replication exception.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        a list of responses from all the members of the cluster. If we met an exception on a given node, the RPCException will be the corresponding response of this particular node
        Throws:
        RPCException - in the event of problems.
      • executeCommandOnAllNodesMain

        protected List<Object> executeCommandOnAllNodesMain​(RemoteCommand command,
                                                            boolean synchronous,
                                                            long timeout,
                                                            Serializable... args)
                                                     throws RPCException
        Executes a command on all the cluster nodes. This method is equivalent to the other method of the same type but with the default timeout. The command must be registered first otherwise an RPCException will be thrown.
        Parameters:
        command - The command to execute on each cluster node
        synchronous - if true, sets group request mode to org.jgroups.blocks.GroupRequest#GET_ALL, and if false sets it to org.jgroups.blocks.GroupRequest#GET_NONE.
        timeout - a timeout after which to throw a replication exception.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        a list of responses from all the members of the cluster. If we met an exception on a given node, the RPCException will be the corresponding response of this particular node
        Throws:
        RPCException - in the event of problems.
      • executeCommandOnCoordinator

        public Object executeCommandOnCoordinator​(RemoteCommand command,
                                                  boolean synchronous,
                                                  Serializable... args)
                                           throws RPCException
        Executes a command on the coordinator only. This method is equivalent to the other method of the same type but with the default timeout. The command must be registered first otherwise an RPCException will be thrown.
        Specified by:
        executeCommandOnCoordinator in interface RPCService
        Parameters:
        command - The command to execute on the coordinator node
        synchronous - if true, sets group request mode to org.jgroups.blocks.GroupRequest#GET_ALL, and if false sets it to org.jgroups.blocks.GroupRequest#GET_NONE.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        the response of the coordinator.
        Throws:
        RPCException - in the event of problems.
      • executeCommandOnCoordinator

        public Object executeCommandOnCoordinator​(RemoteCommand command,
                                                  long timeout,
                                                  Serializable... args)
                                           throws RPCException
        Executes a command synchronously on the coordinator only. The command must be registered first otherwise an RPCException will be thrown.
        Specified by:
        executeCommandOnCoordinator in interface RPCService
        Parameters:
        command - The command to execute on the coordinator node
        timeout - a timeout after which to throw a replication exception.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        the response of the coordinator.
        Throws:
        RPCException - in the event of problems.
      • executeCommandOnCoordinatorMain

        protected Object executeCommandOnCoordinatorMain​(RemoteCommand command,
                                                         boolean synchronous,
                                                         long timeout,
                                                         Serializable... args)
                                                  throws RPCException
        Executes a command on the coordinator only. This method is equivalent to the other method of the same type but with the default timeout. The command must be registered first otherwise an RPCException will be thrown.
        Parameters:
        command - The command to execute on the coordinator node
        synchronous - if true, sets group request mode to org.jgroups.blocks.GroupRequest#GET_ALL, and if false sets it to org.jgroups.blocks.GroupRequest#GET_NONE.
        timeout - a timeout after which to throw a replication exception.
        args - an array of Serializable objects corresponding to parameters of the command to execute remotely
        Returns:
        the response of the coordinator.
        Throws:
        RPCException - in the event of problems.
      • excecuteCommand

        protected List<Object> excecuteCommand​(List<org.jgroups.Address> dests,
                                               RemoteCommand command,
                                               boolean synchronous,
                                               long timeout,
                                               Serializable... args)
                                        throws RPCException
        Execute the command on all the nodes corresponding to the list of destinations.
        Parameters:
        dests - the list of members on which the command needs to be executed
        command - the command to execute
        synchronous - if true, sets group request mode to org.jgroups.blocks.GroupRequest#GET_ALL, and if false sets it to org.jgroups.blocks.GroupRequest#GET_NONE.
        timeout - a timeout after which to throw a replication exception.
        args - the list of parameters
        Returns:
        a list of responses from all the targeted members of the cluster.
        Throws:
        RPCException - in the event of problems.
      • handle

        public Object handle​(org.jgroups.Message msg)
        Specified by:
        handle in interface org.jgroups.blocks.RequestHandler
      • block

        public void block()
        Specified by:
        block in interface org.jgroups.MembershipListener
      • suspect

        public void suspect​(org.jgroups.Address suspectedMbr)
        Specified by:
        suspect in interface org.jgroups.MembershipListener
      • viewAccepted

        public void viewAccepted​(org.jgroups.View view)
        Specified by:
        viewAccepted in interface org.jgroups.MembershipListener
      • registerCommand

        public RemoteCommand registerCommand​(RemoteCommand command)
        Register a new RemoteCommand instance, it will be mapped to its id. If a command with the same Id has already been registered, a warning will be printed into the log file and the new command will replace the old one.
        Specified by:
        registerCommand in interface RPCService
        Parameters:
        command - the instance of the RemoteCommand to register
        Returns:
        the command itself if it could be registered null otherwise
      • unregisterCommand

        public void unregisterCommand​(RemoteCommand command)
        Unregister a RemoteCommand instance, if the id is known or the instance itself is known otherwise it will be ignored
        Specified by:
        unregisterCommand in interface RPCService
        Parameters:
        command - the command to unregister
      • isCoordinator

        public boolean isCoordinator()
                              throws RPCException
        Indicates whether the local node is the coordinator of the cluster
        Specified by:
        isCoordinator in interface RPCService
        Returns:
        true if the coordinator is the coordinator, false otherwise throws RPCException in case the RPCService is in an illegal state
        Throws:
        RPCException
      • getCommand

        protected RemoteCommand getCommand​(String commandId)
        Gives the RemoteCommand corresponding to the given id
        Parameters:
        commandId - the command id of the command to retrieve
        Returns:
        the corresponding RemoteCommand
      • start

        public void start()
        Specified by:
        start in interface org.picocontainer.Startable
      • stop

        public void stop()
        Specified by:
        stop in interface org.picocontainer.Startable
      • getDefaultTimeout

        protected long getDefaultTimeout()
        Gives the value of the default timeout
        Returns:
        the default timeout
      • getClusterName

        protected String getClusterName()
        Gives the name of the cluster
        Returns:
        the name of the cluster
      • getRetryTimeout

        protected long getRetryTimeout()
        Gives the value of the retry timeout
        Returns:
        the value of the retry timeout
      • isAllowFailover

        protected boolean isAllowFailover()
        Indicates whether the failover capabilities are enabled or not
        Returns:
        true if the failover capabilities are allowed, false otherwise
      • getLocalAddress

        protected abstract org.jgroups.Address getLocalAddress()
        Returns the channel's own address. The result of calling this method on an unconnected channel is implementation defined (may return null). Calling this method on a closed channel returns null. Successor to #getAddress(). Addresses can be used as destination in the send() operation.
        Returns:
        The channel's address (opaque) or null if it cannot be found
      • getHostAddress

        public abstract String getHostAddress()
        Returns the IP address of current channel.
        Returns:
        The Host's address or null if it cannot be found
      • castMessage

        protected abstract org.jgroups.util.RspList castMessage​(List<org.jgroups.Address> dests,
                                                                org.jgroups.Message msg,
                                                                boolean synchronous,
                                                                long timeout)
                                                         throws Exception
        Cast a message to all the given members
        Parameters:
        dests - The members to which the message is to be sent.
        msg - The message to be sent to the members.
        synchronous - Indicates whether the message must be sent in synchronous or asynchronous mode.
        timeout - If 0: wait forever. Otherwise, wait for responses or timeout time.
        Returns:
        A list of responses. Each response is an Object and associated to its sender.
        Throws:
        Exception - if any error occur while casting the message
      • createChannel

        protected abstract org.jgroups.Channel createChannel()
                                                      throws Exception
        Create a channel
        Returns:
        An initialized channel
        Throws:
        Exception - if any error occur while creating the channel
      • getMembers

        protected abstract List<org.jgroups.Address> getMembers​(org.jgroups.View view)
        Returns a reference to the List of members (ordered) Do NOT change this list, hence your will invalidate the view Make a copy if you have to modify it.
        Returns:
        a reference to the ordered list of members in this view
      • setObject

        protected abstract void setObject​(org.jgroups.Message m,
                                          Object o)
        Takes an object and uses Java serialization to generate the byte[] buffer which is set in the message.