2.17.2: 2011-06-17

net.sf.basedb.core.signal
Class AbstractSignalReceiver

java.lang.Object
  extended by 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 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: 2010-09-02 14:09:15 +0200 (Thu, 02 Sep 2010) $

Field Summary
private  Map<String,SignalHandler> handlers
          Maps local signal handler ID to -> signal handler itself.
private static Logger logger
          Log signals processing.
private  Thread notifyThread
           
private  String receiverId
           
 
Constructor Summary
protected AbstractSignalReceiver()
          Create a new signal receiver.
 
Method Summary
 void close(int wait)
          Close this signal receiver.
protected  String getGlobalSignalId(SignalHandler handler)
          Generate a signal ID string.
protected  String getLocalSignalHandlerId(SignalHandler handler)
          Get the local signal handler id of the given signal handler.
protected  String getReceiverId()
          Get the receiver ID that was passed to the init(String) method.
protected  SignalHandler getSignalHandler(String localId)
          Get the signal handler with a given ID.
 void init(String receiverId)
          Initialise the signal receiver.
protected  void processSignalMessage(String message)
          Process a signal message.
 String registerSignalHandler(SignalHandler handler)
          Register a signal handler with this receiver.
 void sendToAll(Signal signal)
          Deprecated. In 2.16, use sendToAll(SignalSender) instead
 void sendToAll(SignalSender sender)
          Let the signal sender send one or more signals to all registered signal handlers on this reciever.
 void unregisterSignalHandler(SignalHandler handler)
          Unregister a signal handler.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface net.sf.basedb.core.signal.SignalReceiver
getSignalTransporterClass
 

Field Detail

logger

private static final 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

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:
AbstractSignalReceiver

unregisterSignalHandler

public void unregisterSignalHandler(SignalHandler handler)
Unregister a signal handler.

Specified by:
unregisterSignalHandler in interface SignalReceiver
Parameters:
handler - The signal handler to unregister

sendToAll

@Deprecated
public void sendToAll(Signal signal)
Deprecated. In 2.16, use sendToAll(SignalSender) instead

Description copied from interface: SignalReceiver
Send a signal to all registered signal handlers that supports it. The main purpose of this method is to be able to send the Signal.ABORT when the system is shutting down.

Specified by:
sendToAll in interface SignalReceiver
Parameters:
signal - The signal to send

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 simply return the system hashcode for the handler. The returned ID must be unique among the registered signal handlers.

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

2.17.2: 2011-06-17