Class SignalProtocol<INFRA_STRUCTURE>

java.lang.Object
org.eclipse.net4j.util.event.Notifier
org.eclipse.net4j.util.lifecycle.Lifecycle
org.eclipse.spi.net4j.Protocol<INFRA_STRUCTURE>
org.eclipse.net4j.signal.SignalProtocol<INFRA_STRUCTURE>
Type Parameters:
INFRA_STRUCTURE - the infrastructure structure associated with the protocol
All Implemented Interfaces:
IBufferHandler, ILocationAware, IProtocol<INFRA_STRUCTURE>, IProtocol2<INFRA_STRUCTURE>, IProtocol3<INFRA_STRUCTURE>, ISignalProtocol<INFRA_STRUCTURE>, ISignalProtocol.WithSignalCounters<INFRA_STRUCTURE>, org.eclipse.net4j.util.collection.Entity.Store.Provider, org.eclipse.net4j.util.concurrent.IExecutorServiceProvider, org.eclipse.net4j.util.container.IManagedContainerProvider, org.eclipse.net4j.util.event.INotifier, org.eclipse.net4j.util.event.INotifier.INotifier2, org.eclipse.net4j.util.lifecycle.IDeactivateable, org.eclipse.net4j.util.lifecycle.ILifecycle, org.eclipse.net4j.util.lifecycle.ILifecycle.DeferrableActivation, org.eclipse.net4j.util.security.IUserAware
Direct Known Subclasses:
AuthenticatingSignalProtocol, HeartBeatProtocol, HeartBeatProtocol.Server

public class SignalProtocol<INFRA_STRUCTURE> extends Protocol<INFRA_STRUCTURE> implements ISignalProtocol.WithSignalCounters<INFRA_STRUCTURE>, org.eclipse.net4j.util.collection.Entity.Store.Provider
The default implementation of a signal protocol.

On the receiver side(s) of protocol the createSignalReactor() method has to be overridden to create appropriate peer instances for incoming signals.

Author:
Eike Stepper
  • Field Details

    • COMPRESSED_STRINGS_ACKNOWLEDGE_TIMEOUT

      public static final long COMPRESSED_STRINGS_ACKNOWLEDGE_TIMEOUT
      Since:
      4.7
    • SIGNAL_REMOTE_EXCEPTION

      public static final short SIGNAL_REMOTE_EXCEPTION
      Since:
      2.0
      See Also:
    • SIGNAL_MONITOR_CANCELED

      public static final short SIGNAL_MONITOR_CANCELED
      Since:
      2.0
      See Also:
    • SIGNAL_MONITOR_PROGRESS

      public static final short SIGNAL_MONITOR_PROGRESS
      Since:
      2.0
      See Also:
    • SIGNAL_SET_TIMEOUT

      public static final short SIGNAL_SET_TIMEOUT
      Since:
      4.1
      See Also:
    • SIGNAL_ACKNOWLEDGE_COMPRESSED_STRINGS

      public static final short SIGNAL_ACKNOWLEDGE_COMPRESSED_STRINGS
      Since:
      4.7
      See Also:
    • SIGNAL_ENTITY

      public static final short SIGNAL_ENTITY
      Since:
      4.20
      See Also:
  • Constructor Details

    • SignalProtocol

      public SignalProtocol(String type)
      Since:
      2.0
  • Method Details

    • getTimeout

      public long getTimeout()
      Specified by:
      getTimeout in interface ISignalProtocol<INFRA_STRUCTURE>
      Since:
      2.0
    • setTimeout

      public void setTimeout(long timeout)
      Equivalent to calling SignalProtocol.setTimeout(timeout, false).
      Specified by:
      setTimeout in interface ISignalProtocol<INFRA_STRUCTURE>
      Since:
      2.0
    • setTimeout

      public boolean setTimeout(long timeout, boolean useOldTimeoutToSendNewOne)
      Update the timeout used for signal end of stream waiting time.
      Parameters:
      timeout - the new timeout
      useOldTimeoutToSendNewOne - true to use the old timeout, false to use the new specified one to sent to server side the new specified timeout
      Returns:
      true if the new specified timeout has correctly been sent NOTE: this second parameter is useful mostly for test to be able to set a to small timeout
      Since:
      4.4
    • isTrustingPeer

      public boolean isTrustingPeer()
      Since:
      4.22
    • setTrustingPeer

      public void setTrustingPeer(boolean trustingPeer)
      Since:
      4.22
    • getStreamWrapper

      public org.eclipse.net4j.util.io.IStreamWrapper getStreamWrapper()
      Specified by:
      getStreamWrapper in interface ISignalProtocol<INFRA_STRUCTURE>
    • setStreamWrapper

      public void setStreamWrapper(org.eclipse.net4j.util.io.IStreamWrapper streamWrapper)
      Specified by:
      setStreamWrapper in interface ISignalProtocol<INFRA_STRUCTURE>
    • addStreamWrapper

      public void addStreamWrapper(org.eclipse.net4j.util.io.IStreamWrapper streamWrapper)
      Specified by:
      addStreamWrapper in interface ISignalProtocol<INFRA_STRUCTURE>
    • getEntityStore

      public org.eclipse.net4j.util.collection.Entity.Store getEntityStore()
      Specified by:
      getEntityStore in interface org.eclipse.net4j.util.collection.Entity.Store.Provider
    • getSentSignals

      public long getSentSignals()
      Specified by:
      getSentSignals in interface ISignalProtocol.WithSignalCounters<INFRA_STRUCTURE>
      Since:
      4.13
    • getReceivedSignals

      public long getReceivedSignals()
      Specified by:
      getReceivedSignals in interface ISignalProtocol.WithSignalCounters<INFRA_STRUCTURE>
    • open

      public IChannel open(IConnector connector)
      Specified by:
      open in interface ISignalProtocol<INFRA_STRUCTURE>
      Since:
      2.0
    • close

      public void close()
      Specified by:
      close in interface ISignalProtocol<INFRA_STRUCTURE>
      Since:
      2.0
    • waitForSignals

      public boolean waitForSignals(long timeout)
    • handleBuffer

      public void handleBuffer(IBuffer buffer)
      Handles a given (incoming) buffer.

      Creates a signal to act upon the given buffer or uses a previously created signal.

      Specified by:
      handleBuffer in interface IBufferHandler
      Parameters:
      buffer - The buffer to be handled.
    • toString

      public String toString()
      Overrides:
      toString in class org.eclipse.net4j.util.lifecycle.Lifecycle
    • doBeforeDeactivate

      protected void doBeforeDeactivate() throws Exception
      Overrides:
      doBeforeDeactivate in class org.eclipse.net4j.util.lifecycle.Lifecycle
      Throws:
      Exception
    • doDeactivate

      protected void doDeactivate() throws Exception
      Overrides:
      doDeactivate in class Protocol<INFRA_STRUCTURE>
      Throws:
      Exception
    • handleChannelDeactivation

      protected void handleChannelDeactivation()
      Overrides:
      handleChannelDeactivation in class Protocol<INFRA_STRUCTURE>
    • provideSignalReactor

      protected final SignalReactor provideSignalReactor(short signalID)
    • createSignalReactor

      protected SignalReactor createSignalReactor(short signalID)
      Returns a new signal instance to serve the given signal ID or null if the signal ID is invalid/unknown for this protocol.
    • isSendingTimeoutChanges

      protected boolean isSendingTimeoutChanges()
      Returns true by default, override to change this behavior.
      Since:
      4.1
    • getStringCompressor

      protected org.eclipse.net4j.util.io.StringCompressor getStringCompressor()
      Since:
      4.7
    • getDeactivationTimeout

      protected long getDeactivationTimeout()
      Since:
      4.22
    • getSignalReactorOrderKey

      protected Object getSignalReactorOrderKey(SignalReactor signal)
      Returns the execution-order key for an incoming signal reactor.

      Equal non-null keys, according to Object.equals(Object) and Object.hashCode(), select one execution lane. Signals in that lane execute sequentially in the order this protocol receives their begin-of-signal buffers. Different keys may execute concurrently, and signals with a null key use the normal executor and may run concurrently with both ordered lanes and each other. This preserves receiver-side reception order only; it does not establish semantic ordering between signals produced independently by senders.

      Keys should normally be stable and low-cardinality. A signal class is often a natural key, and different signal classes may deliberately return the same key when they must share a lane. Keys and their executors are retained for this protocol's active lifetime.

      For example:

       if (signal instanceof MySensibleIndication)
       {
         return MySensibleIndication.class;
       }
       
      Parameters:
      signal - the incoming signal reactor
      Returns:
      the order key, or null for normal unordered execution
      Since:
      4.23
    • getSignalReactorExecutor

      protected Executor getSignalReactorExecutor(SignalReactor signal)
      Returns the executor for an incoming signal reactor. The default preserves the direct executor fast path for unordered signals and uses a protocol-owned serial executor for a non-null order key.
      Parameters:
      signal - the incoming signal reactor
      Returns:
      the executor that will run the signal
      Since:
      4.23
    • getSignalReactorExecutor

      protected Executor getSignalReactorExecutor(SignalReactor signal, Object orderKey)
      Returns the serial executor associated with an order key, creating it on first use. Keys are compared using normal equals() and hashCode() semantics. The executor is retained for the active lifetime of this protocol and deactivated with it.
      Parameters:
      signal - the first signal reactor that caused this lane to be created, or a later signal assigned to the lane
      orderKey - the non-null key identifying the lane
      Returns:
      the executor for the lane
      Since:
      4.23
    • createSignalReactorExecutor

      protected Executor createSignalReactorExecutor(SignalReactor signal, Object orderKey)
      Creates the serial executor for a newly encountered order key. The signal argument is the first reactor that caused this lane to be created; it does not imply that the lane is dedicated to that reactor's class.
      Parameters:
      signal - the first signal reactor assigned to the lane
      orderKey - the non-null key identifying the lane
      Returns:
      a serial executor for the lane
      Since:
      4.23