Class ProtocolStack

java.lang.Object
org.jgroups.stack.Protocol
org.jgroups.stack.ProtocolStack
All Implemented Interfaces:
Transport

public class ProtocolStack extends Protocol implements Transport
A ProtocolStack manages a number of protocols layered above each other. It creates all protocol classes, initializes them and, when ready, starts all of them, beginning with the bottom most protocol. It also dispatches messages received from the stack to registered objects (e.g. channel, GMP) and sends messages sent by those objects down the stack.

The ProtocolStack makes use of the Configurator to setup and initialize stacks, and to destroy them again when not needed anymore

Author:
Bela Ban
  • Field Details

  • Constructor Details

  • Method Details

    • getChannel

      public JChannel getChannel()
    • setChannel

      public void setChannel(JChannel ch)
    • getThreadFactory

      public ThreadFactory getThreadFactory()
      Deprecated.
      Description copied from class: Protocol
      Supposed to be overwritten by subclasses. Usually the transport returns a valid non-null thread factory, but thread factories can also be created by individual protocols
      Overrides:
      getThreadFactory in class Protocol
      Returns:
    • getTimerThreadFactory

      @Deprecated public static ThreadFactory getTimerThreadFactory()
      Deprecated.
    • setThreadFactory

      public void setThreadFactory(ThreadFactory f)
      Deprecated.
      Parameters:
      f -
    • setTimerThreadFactory

      public static void setTimerThreadFactory(ThreadFactory f)
      Parameters:
      f -
    • getTimerThreads

      public int getTimerThreads()
      Deprecated.
      Use TP.getTimer() to fetch the timer and call getCorePoolSize() directly
      Returns:
    • getProtocols

      public List<Protocol> getProtocols()
      Returns all protocols in a list, from top to bottom. These are not copies of protocols, so modifications will affect the actual instances !
    • copyProtocols

      public List<Protocol> copyProtocols(ProtocolStack targetStack) throws IllegalAccessException, InstantiationException
      Throws:
      IllegalAccessException
      InstantiationException
    • getTransport

      public TP getTransport()
      Returns the bottom most protocol
      Overrides:
      getTransport in class Protocol
    • getSingletonTransports

      public static ConcurrentMap<String,Tuple<TP,ProtocolStack.RefCounter>> getSingletonTransports()
    • dumpStats

      public Map<String,Object> dumpStats()
      Overrides:
      dumpStats in class Protocol
      Returns:
      Mapinvalid input: '<'String,Mapinvalid input: '<'key,val>>
    • dumpStats

      public Map<String,Object> dumpStats(String protocol_name)
    • dumpStats

      public Map<String,Object> dumpStats(String protocol_name, List<String> attrs)
    • dumpTimerQueue

      public String dumpTimerQueue()
      Deprecated.
      Use TP.getTimer() instead to fetch the timer from the transport and then invoke the method on it
      Returns:
    • printProtocolSpec

      public String printProtocolSpec(boolean include_properties)
      Prints the names of the protocols, from the bottom to top. If include_properties is true, the properties for each protocol will also be printed.
    • printProtocolSpecAsXML

      public String printProtocolSpecAsXML()
    • printProtocolSpecAsPlainString

      public String printProtocolSpecAsPlainString()
    • setup

      public void setup(List<ProtocolConfiguration> configs) throws Exception
      Throws:
      Exception
    • setup

      public void setup(ProtocolStack stack) throws Exception
      Throws:
      Exception
    • addProtocol

      public ProtocolStack addProtocol(Protocol prot)
      Adds a protocol at the tail of the protocol list
      Parameters:
      prot -
      Returns:
      Since:
      2.11
    • addProtocols

      public ProtocolStack addProtocols(Protocol... prots)
      Adds a list of protocols
      Parameters:
      prots -
      Returns:
      Since:
      2.11
    • addProtocols

      public ProtocolStack addProtocols(List<Protocol> prots)
      Adds a list of protocols
      Parameters:
      prots -
      Returns:
      Since:
      2.1
    • insertProtocol

      public void insertProtocol(Protocol prot, int position, String neighbor_prot) throws Exception
      Inserts an already created (and initialized) protocol into the protocol list. Sets the links to the protocols above and below correctly and adjusts the linked list of protocols accordingly. Note that this method may change the value of top_prot or bottom_prot.
      Parameters:
      prot - The protocol to be inserted. Before insertion, a sanity check will ensure that none of the existing protocols have the same name as the new protocol.
      position - Where to place the protocol with respect to the neighbor_prot (ABOVE, BELOW)
      neighbor_prot - The name of the neighbor protocol. An exception will be thrown if this name is not found
      Throws:
      Exception - Will be thrown when the new protocol cannot be created, or inserted.
    • insertProtocolInStack

      public void insertProtocolInStack(Protocol prot, Protocol neighbor, int position)
    • insertProtocol

      public void insertProtocol(Protocol prot, int position, Class<? extends Protocol> neighbor_prot) throws Exception
      Throws:
      Exception
    • insertProtocol

      public void insertProtocol(Protocol prot, int position, Class<? extends Protocol>... neighbor_prots) throws Exception
      Throws:
      Exception
    • insertProtocolAtTop

      public void insertProtocolAtTop(Protocol prot)
    • removeProtocol

      public Protocol removeProtocol(String prot_name) throws Exception
      Removes a protocol from the stack. Stops the protocol and readjusts the linked lists of protocols.
      Parameters:
      prot_name - The name of the protocol. Since all protocol names in a stack have to be unique (otherwise the stack won't be created), the name refers to just 1 protocol.
      Throws:
      Exception - Thrown if the protocol cannot be stopped correctly.
    • removeProtocol

      public Protocol removeProtocol(Class... protocols)
    • removeProtocol

      public Protocol removeProtocol(Class prot)
    • findProtocol

      public Protocol findProtocol(String name)
      Returns a given protocol or null if not found
    • getBottomProtocol

      public Protocol getBottomProtocol()
    • getTopProtocol

      public Protocol getTopProtocol()
    • findProtocol

      public Protocol findProtocol(Class<?> clazz)
    • findProtocol

      public Protocol findProtocol(Class<?>... classes)
      Finds the first protocol of a list and returns it. Returns null if no protocol can be found
      Parameters:
      classes - A list of protocol classes to find
      Returns:
      Protocol The protocol found
    • createProtocol

      protected Protocol createProtocol(String classname) throws Exception
      Throws:
      Exception
    • init

      public void init() throws Exception
      Description copied from class: Protocol
      Called after instance has been created (null constructor) and before protocol is started. Properties are already set. Other protocols are not yet connected and events cannot yet be sent.
      Overrides:
      init in class Protocol
      Throws:
      Exception - Thrown if protocol cannot be initialized successfully. This will cause the ProtocolStack to fail, so the channel constructor will throw an exception
    • initProtocolStack

      public void initProtocolStack() throws Exception
      Throws:
      Exception
    • destroy

      public void destroy()
      Description copied from class: Protocol
      This method is called on a Channel.close(). Does some cleanup; after the call the VM will terminate
      Overrides:
      destroy in class Protocol
    • startStack

      public void startStack(String cluster_name, Address local_addr) throws Exception
      Start all layers. The Protocol.start() method is called in each protocol, from top to bottom. Each layer can perform some initialization, e.g. create a multicast socket
      Throws:
      Exception
    • stopStack

      public void stopStack(String cluster_name)
      Iterates through all the protocols from top to bottom and does the following:
      1. Waits until all messages in the down queue have been flushed (ie., size is 0)
      2. Calls stop() on the protocol
    • flushEvents

      public void flushEvents()
      Deprecated.
      Not needed anymore, just left in here for backwards compatibility with JBoss AS
    • send

      public void send(Message msg) throws Exception
      Specified by:
      send in interface Transport
      Throws:
      Exception
    • receive

      public Object receive(long timeout) throws Exception
      Specified by:
      receive in interface Transport
      Throws:
      Exception
    • getName

      public String getName()
      Description copied from class: Protocol
      All protocol names have to be unique !
      Overrides:
      getName in class Protocol
    • up

      public Object up(Event evt)
      Description copied from class: Protocol
      An event was received from the layer below. Usually the current layer will want to examine the event type and - depending on its type - perform some computation (e.g. removing headers from a MSG event type, or updating the internal membership list when receiving a VIEW_CHANGE event). Finally the event is either a) discarded, or b) an event is sent down the stack using down_prot.down() or c) the event (or another event) is sent up the stack using up_prot.up().
      Overrides:
      up in class Protocol
    • down

      public Object down(Event evt)
      Description copied from class: Protocol
      An event is to be sent down the stack. The layer may want to examine its type and perform some action on it, depending on the event's type. If the event is a message MSG, then the layer may need to add a header to it (or do nothing at all) before sending it down the stack using down_prot.down(). In case of a GET_ADDRESS event (which tries to retrieve the stack's address from one of the bottom layers), the layer may need to send a new response event back up the stack using up_prot.up().
      Overrides:
      down in class Protocol