Monitoring Status with Monitor Threads

Applications often need to monitor the state of the environment in which they run. Monitor threads provide a framework for monitoring changes in the status of part of a system that cannot be monitored by listening for events.

1. Introduction

Applications often need to monitor the state of the environment in which they run. For example, an application might need to know whether a server is on-line and receiving requests from clients. The application might provide a user interface, such as a server icon, that represents the current status of the server: the icon is enabled when the server is on-line and disabled when it is off-line.

Another example is an application that needs to monitor the contents of a directory. The application might implement real-time active loading of extensions: users copy extension files into an extension directory and the application detects the new files and loads the new extensions automatically.

If the object to be monitored is part of the application, the application can listen for events generated by the object to notify interested clients that it has changed. If the object to be monitored is not part of the application, or does not generate events, another solution is needed.

2. Monitor Threads

Monitor threads run in a cycle of monitoring and sleeping for a specified amount of time. Monitor threads are implemented by the MonitorThread class. The MonitorThread class implements the monitoring loop: the thread sleeps for a specified period of time, calls its void monitor() method and resumes sleeping.

The MonitorThread class is abstract and sub-classes must extend it to override the monitor() method. The contract of the monitor() method is that when called, it should check whatever it is designed to check and generate an appropriate event that will be sent to registered event listeners.

The amount of time the thread sleeps for determines the time between calling the monitor() method. This interval is application specific and is heavily influenced by the cost of performing the monitoring operation.

The MonitorThread class provides methods for adding and removing event listeners. Event listener objects implement the MonitorThreadEventListener interface, which provides a basic implementation for monitor thread events. The monitorChanged() method of the MonitorThreadEventListener interface is called to indicate that the state of the object being monitored has changed. The MonitorThreadEventListener interface can be extended to provide application specific event notification methods.

The MonitorThread class has three methods for controlling the state of a monitor thread: suspendMonitor() pauses the monitor thread; resumeMonitor() reactivates a paused monitor thread; and stopMonitor() stops a monitor thread running (stopped monitor threads cannot be resumed).

The following diagram illustrates the class diagram of the MonitorThread class and two example monitor thread classes. The monitor() method of the ServerMonitor class polls a specified server to check its availability. The monitor() method of the DirectoryMonitor class checks the names and number of files in a specified directory to determine whether the contents of the directory has changed. ServerMonitorThreadClient and DirectoryMonitorThreadClient objects listen for the events generated by the sub-classes of the MonitorThread class.

Class diagram of the MonitorThread class