Class 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 Detail

      • logger

        private static final org.slf4j.Logger logger
        Log signals processing.
      • handlers

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

        private String receiverId
      • notifyThread

        private Thread notifyThread
    • Constructor Detail

      • AbstractSignalReceiver

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

      • 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
      • 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