Class AbstractSignalReceiver

java.lang.Object
net.sf.basedb.core.signal.AbstractSignalReceiver
All Implemented Interfaces:
SignalReceiver
Direct Known Subclasses:
LocalSignalReceiver, SocketSignalReceiver

public abstract class AbstractSignalReceiver extends Object implements SignalReceiver
Abstract base class that is useful when implementing signal receivers. This class helps with keeping track of signal handlers and with generating return values for the registerSignalHandler(SignalHandler) method. This class will generate values in the form of URI:s. signal://handlerId@receiverId/?supportedSignals.
  • The receiverId part is given by the parameter in the init(String) method and must be set by the implementing subclass.
  • The handlerId part is given by calling getLocalSignalHandlerId(SignalHandler). This method may be overridden by subclasses that needs a different method of local ID generation. The important thing is that the ID is unique among all registered signal handlers.
  • The supportedSignals part is created by joining all signal ID:s from SignalHandler.getSupportedSignals() into a comma-separated string.
The AbstractSignalTransporter contains methods for parsing this scheme and make the information available to subclasses as a URI and as higher-level objects.

Subclasses should override the getGlobalSignalId(SignalHandler) if they want to use a different ID generation scheme.

Version:
2.6
Author:
nicklas
Last modified
$Date: 2015-05-12 11:27:08 +0200 (ti, 12 maj 2015) $
  • Field Details

    • logger

      private static final Logger logger
      Log signals processing.
    • handlers

      private Map<String,SignalHandler> handlers
      Maps local signal handler ID to -> signal handler itself.
    • handlerIds

      private Map<SignalHandler,String> handlerIds
    • receiverId

      private String receiverId
    • notifyThread

      private Thread notifyThread
  • Constructor Details

    • AbstractSignalReceiver

      protected AbstractSignalReceiver()
      Create a new signal receiver.
  • Method Details

    • init

      public void init(String receiverId)
      Initialise the signal receiver.
      Specified by:
      init in interface SignalReceiver
      Parameters:
      receiverId - The ID of the signal receiver, needed if the default ID generation should be used
    • close

      public void close(int wait)
      Close this signal receiver. If a subclass overrides this method it should call super.close() if it wants to use the default shutdown notification to signal handlers. This implementation will start a separate notification thread that first sends the Signal.SHUTDOWN signal to all registered handlers, and then Signal.ABORT signal to all that are still alive after the shutdown signal. The current thread will wait at most the given time. If the number of registered handlers goes down to 0 before the time has ended the current thread will be awakened so it can continue. Note that the notification thread will usually finish in a short time, but it may take longer for all worker thread of each job to react to the signal.
      Specified by:
      close in interface SignalReceiver
      Parameters:
      wait - Number of milliseconds to wait for registered jobs to abort, use a negative value to disable notification, and 0 to disable waiting
    • registerSignalHandler

      public String registerSignalHandler(SignalHandler handler)
      Register a signal handler with this receiver.
      Specified by:
      registerSignalHandler in interface SignalReceiver
      Parameters:
      handler - The signal handler to register
      Returns:
      The global ID of the signal handler
      See Also:
    • unregisterSignalHandler

      public void unregisterSignalHandler(SignalHandler handler)
      Unregister a signal handler.
      Specified by:
      unregisterSignalHandler in interface SignalReceiver
      Parameters:
      handler - The signal handler to unregister
    • sendToAll

      public void sendToAll(SignalSender sender)
      Description copied from interface: SignalReceiver
      Let the signal sender send one or more signals to all registered signal handlers on this reciever.
      Specified by:
      sendToAll in interface SignalReceiver
      Parameters:
      sender - A signal sender implementation
    • getReceiverId

      protected String getReceiverId()
      Get the receiver ID that was passed to the init(String) method.
    • getGlobalSignalId

      protected String getGlobalSignalId(SignalHandler handler)
      Generate a signal ID string. This string is returned by the registerSignalHandler(SignalHandler) method and is used in SignalTransporter.init(String) method to initialise a transporter object so that it can send signals to the specified handler. See the class documentation for a description of the format of the generated string. The string is of the format:

      signal://handlerId@receiverId/?supportedSignals

      See class description for detailed information.

      Parameters:
      handler - The signal handler to generate the ID for
      Returns:
      The signal handler ID
    • getLocalSignalHandlerId

      protected String getLocalSignalHandlerId(SignalHandler handler)
      Get the local signal handler id of the given signal handler. This implementation generates a unique ID for the handler.
      Parameters:
      handler - The handler to get the id for
      Returns:
      The local handler id
    • getSignalHandler

      protected SignalHandler getSignalHandler(String localId)
      Get the signal handler with a given ID.
      Parameters:
      localId - The local signal handler ID as returned by the getLocalSignalHandlerId(SignalHandler) method
      Returns:
      The signal handler, or null if no handler is found
    • processSignalMessage

      protected void processSignalMessage(String message)
      Process a signal message. If the message can't be understood or if no handler can be found this method does nothing. The signal will be delivered to the signal handler in the current thread.
      Parameters:
      message - The message to process, the format of the message must be compatible with the message that AbstractSignalTransporter.generateSignalMessage(Signal) generates