java.util.EventObject
zu implementieren.
Innerhalb dieser Klasse können Properties verwendet werden, die bei Empfang und Auswertung
des Events zusätzliche Informationen enthalten können (z.B. Laufzeit des Objekts innerhalb eines
Netzes). Die Erstellung einer Klasse ermöglicht die Verwendung mehrerer Konstruktoren.
Dadurch kann die Art und Struktur der Event-Klasse spezifischen Erfordernissen angepaßt
werden. Ein Beispiel für eine Event-Klasse ist nachfolgend dargestellt:
package tis20.impl; import java.util.EventObject; public class NetworkParmsImplEvent extends EventObject { /** * Create a NetworkParmsImplEvent object. The source of the event * as well as the value of the "NbChanges" property needs * to be specified. */ public NetworkParmsImplEvent(NetworkParmsImpl source) { super(source); } public NetworkParmsImplEvent(NetworkParmsImpl source , String ComputerName) { super(source); } /** * Returns the version of this class. */ public String getClassVersion() { return (sccs_id); } /** * Version of the implementation */ private static final String sccs_id = "@(#)NetworkParmsImplEvent.java 1.0 01/01/99"; }
java.util.EventListener
abzuleiten und es sind die Methoden
bekanntzugeben, welche bei Erhalt eines Events angewendet werden sollen. Eine Listener-Klasse
kann folgendermaßen aussehen:
package tis20.impl; import java.util.*; /** * A NetworkParmsImpl event listener interface. * This interface needs to be implemented * in order to receive * * NetworkParmsImpl events emitted by the * NetworkParmsImplEvent M-bean. * * @version 1.0 01/01/99 * @author Harald Knoechlein */ public interface NetworkParmsImplListener extends java.util.EventListener { public void handleEvent1(NetworkParmsImplEvent evt); public void handleEvent2(NetworkParmsImplEvent evt); }
add<M-Bean-Klasse>Listener
Methode der Listener dem CMF hinzugefügt werden. Es ist zu beachten, daß diese Methode,
ebenso wie die Methode für das Entfernen des Listeners von dem M-Bean zu Verfügung gestellt
werden muß. Falls solche Methoden zum M-Bean hinzugefügt werden sollen, so muß
das M-Bean gestoppt, um den erforderlichen Quellcode erweitert und wieder dem Agenten
hinzugefügt werden (Restart). Es kann allerdings in Erwägung gezogen werden, generell diese Methoden
zu den M-Beans hinzuzunehmen und sich damit eine Hintertür offen zu halten.... // connect to Adaptor ... AdaptorClient adaptor = new AdaptorClient(); adaptor.connect(null, agentHost, agentPort, ServiceName.APT_RMI); ... // Get the instance of the NetworkParmsImpl m-bean in the // remote object server. String NetworkParmsImplClass = "NetworkParmsImpl"; ObjectName NetworkParmsImplName = new ObjectName(domain + ":tis20.impl.NetworkParmsImpl"); tis20.impl.NetworkParmsImplMO NetworkParmsImpl = (tis20.impl.NetworkParmsImplMO) ((Vector)adaptor.getObject(NetworkParmsImplName, null)).firstElement(); ... // Create an event listener. ClientListener listener= new ClientListener(); ... // Register a listener with the remote event source. NetworkParmsImpl.addNetworkParmsImplListenerMO(listener); ...
... /** * Setter for the "ComputerName" variable. */ public void setComputerName(String x) throws SnmpStatusException { String oid = "1.3.6.1.4.1.2206.5.1.1.1.1.0"; ComputerName = x; nativeBase.setNative(tools.ConvertTools.String2Int(oid), x); // Send an event ! // NetworkParmsImplEvent event = new NetworkParmsImplEvent(this, new String(ComputerName)); deliverChange(event); } ... /** * Send an event to all the registered listeners. * * @param event the event to emmit. * */ private void deliverChange(NetworkParmsImplEvent event) { Vector listeners; int n; synchronized (this) { listeners = (Vector)NetworkParmsImplListeners.clone(); n = listeners.size(); if (n == 0) return; } Vector symbols = new Vector(); for (int i = 0; i < listeners.size(); i++) { NetworkParmsImplListener NetworkParmsImplListener = (NetworkParmsImplListener)listener.elementAt(i); NetworkParmsImplListener.handleEvent1(event); } } ...Es wird ein Event-Objekt mit entsprechendem Konstruktor instantiiert und mittels der
deliverChange-
Methode an alle Listener geschickt. Eine Empfangsüberprüfung
findet nicht statt. Eine Möglichkeit wäre, in den Objekten, die Events erhalten, Methoden zur
Versendung von ``EmpfangsEvents'' vorzusehen. Diese Event-Klasse ist jedoch selbst zu
implementieren, es wird kein expliziter Mechanismus von JDMK unterstützt. Wie aus dem obigen
Beispiel zu ersehen ist, wird das EventHandler-Interface von JDMK verwendet. Dieses Interface
ist für die Weiterleitung und Verarbeitung der Events zuständig.
remove<M-Bean-Klasse>Listener
,
welche von der M-Bean-Klasse zur Verfügung gestellt werden muß.