1 Überblick ■ XML-APIs für Java ◆ SAX ◆ DOM Architekturen für verteilte Internetdienste ◆ Java: JDOM, dom4j, StAX ◆ Validierendes Parsen ◆ XML Transformationen ■ Java Remote Method Invocation (RMI) Übung 1: Grundlagen ■ Java Beans ◆ Java Management Extensions [email protected] © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 2 XML-APIs für Java 3 Simple API for XML (SAX) ■ Konzept ■ http://www.saxproject.org/ ◆ Herstellerunabhängige Schnittstelle (API) z.B. Java API for XML Processing (JAXP) für DOM und SAX ■ Konzept ◆ Beliebige Implementierung ◆ Ereignisorientiertes Parsing: XML-Elemente lösen Ereignisse aus • Auswahl zur Laufzeit: System Properties und Factories ◆ Push von „Elementen“ des Dokuments an definierte Callback-Handler ■ Packages: javax.xml, org.xml, org.w3c ◆ Ergebnis: Zustandsloser Stream ohne Navigationsmöglichkeit ■ Hier vorgestellte Parser APIs ■ Handler ◆ Simple API for XML (SAX): Stream Pushing ◆ Dokumentinhaltsbehandlung (ContentHandler) ◆ Document Object Model (DOM): Baum von Dokument-Elementen ◆ Fehlerreaktion (ErrorHandler) ◆ JDOM/dom4j: DOM à la Java ◆ DTD-Manipulation (DTDHandler) ◆ Streaming API for XML (StAX): Stream Pulling (Cursor) ◆ Entity-Referenzauflösung (EntityResolver) ■ Aktueller Parser im Java SDK: Apache-Xerces © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.1 1.2 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.1 Vorgehen 3.2 Implementierung eines eigenen Handlers ■ SAXParserFactory erzeugt SAXParser (javax.xml.parsers) ■ Ableitung von DefaultHandler ■ Dessen SAXReader ruft je nach Element definierte Handler auf, z.B. ContentHandler, ErrorHandler, DTDHandler, EntityResolver, ... ■ Eigenen Handler von DefaultHandler ableiten und Methoden ergänzen ◆ Beinhaltet ContentHandler, ErrorHandler, DTDHandler, EntityResolver public { void void void class MyHandler extends DefaultHandler startDocument() throws SAXException {...} endDocument () ... startElement (String namespaceURI, String sName, String qName, Attributes attrs) ... void endElement (String namespaceURI, String sName, String qName) ... void characters (char[] buf, int offset, int len) ... ... void ignorableWhitespace (char[] buf, int offset, int len) ... void processingInstruction(String target, String data) ... void setDocumentLocator (Locator l) ... ... void warning (SAXParseException e) ... void error (SAXParseException e) ... ◆ Ggf. weitere Handler ableiten und implementieren (z.B. CDATA, DTD-Elemente) ■ Konfigurieren Validierendes Parsen, Namespace-Awareness } 1.3 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.4 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 3.3 Parsen eines XML Dokuments 3.4 Beispiel ■ Beispiel ■ Einfaches XML <?xml version="1.0" encoding="utf-8"?> <n:data xmlns:n="urn:avid-u1"> test </n:data> // Erzeugen des Handlers DefaultHandler hr = new Handler(); //... und des Parsers XMLReader xr = XMLReaderFactory.createXMLReader(); ■ Ausgelöste Events // Handler registrieren xr.setContentHandler(hr); xr.setErrorHandler(hr); ... ◆ startDocument() ◆ startPrefixMapping() -> ◆ startElement() -> n // Spezifikation der einzulesenden Datei FileReader r = new FileReader(__PFAD_ZUR_DATEI__); ◆ characters() -> test ◆ endElement() -> n // Start xr.parse(new InputSource(r)); ◆ endPrefixMapping() -> n, uri=urn:avid-u1 ◆ endDocument() 1.5 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ n, uri=urn:avid-u1 ■ Kein Event bei XML-Deklaration -> Auslesen der Daten über Locator2 Interface möglich © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.6 4 Document Object Model (DOM) 4.1 Vorgehen ■ Parsing läuft automatisch durch und erzeugt DOM-Baum ■ DocumentBuilderFactory erzeugt DocumentBuilder (Parser) ◆ Speicherverbrauch wächst mit Größe des zu parsenden Dokuments ■ Document per newDocument oder Parsing erzeugen ■ Sprachunabhängige API ◆ Root-Element: Document.getDocumentElement() ◆ Navigation: getChildNodes, getNextSibbling, ... ◆ Navigation auf Dokumentbaum von mäßig getypten Knoten => Alles ist ein Knoten (Element, Attribut, Text, ...) ◆ Hinzufügen von Elementen: createElement ◆ Notwendige Typ-Prüfung ◆ Informationen: Node-API mit nodeType, nodeName,nodeValue Node child = data.getFirstChild(); while(child!=null) { if (child.getNodeType() == Node.ELEMENT_NODE) { Element e = (Element) child; ... } else ... child = child.getNextSibling(); } ■ Einfaches Beispiel <e> bla </e> ◆ <e> nodeType()=ELEMENT_NODE, nodeName()=”e”, nodeValue()=null ◆ getNextSibling liefert nächsten Geschwisterknoten zurück (bzw. null) ◆ Auch Rückwärtsnavigation möglich: getPreviousSibling 1.7 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ ◆ bla nodeType()=TEXT_NODE, nodeName()=”#text”, nodeValue()=”bla” 1.8 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 4.2 Parsen eines XML Dokuments 4.3 Wichtige Methoden ■ Beispiel ■ org.w3c.dom.Node ◆ appendChild, removeChild, getTextContent, getParentNode, getOwnerDocument, DocumentBuilderFactory factory; DocumentBuilder builder; Document doc; getNodeName/Type/Value, get/hasAttributes, getFirst/LastChild, getNextSibling, getChildNodes ■ org.w3c.dom.Document // Erzeugen Factory factory = DocumentBuilderFactory.newInstance(); ◆ getDocumentElement, createAttribute, createElement, createTextNode, getElementsByTagName builder = factory.newDocumentBuilder(); ■ Ableitungen: org.w3c.dom.Element, .Attr, .Comment, .Text, ... // Möglicher Error-Handler für Überprüfung des Dokuments builder.setErrorHandler(new org.xml.sax.ErrorHandler() { void warning(SAXParseException ex) {...} void error(SAXParseException ex) {...} void fatalError(SAXParseException ex){...} }); ■ Achtung ◆ getElementsByTagName ist transitiv => nicht auf direkte Subknoten beschränkt ◆ getChildNodes liefert alle Subknoten, nicht nur Subelemente => z.B. auch Text-Knoten (vgl. Beispiel) // Start doc = builder.parse(new File(__PFAD_ZUR_DATEI__)); 1.9 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.10 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 5 JDOM 5.1 Beispiel ■ Java-OOP DOM-Zugriff ■ Implementierung ◆ JSR-102: JDOM 1.0 ◆ Packages: org.jdom.** SAXBuilder builder = new SAXBuilder(true); ◆ http://www.jdom.org Document doc = builder.build(__PFAD_ZUR_DATEI__); ■ Baumdarstellung des XML Dokuments // Wurzelelement Element root = doc.getRootElement(); println("Element: "+root.getName()); ■ Intern: Verwendung SAX/DOM-Parser => z.B. via org.jdom.input.SAXBuilder // Attribute for (Attribute a: root.getAttributes()) println("- Attribute "+a.getName()+"="+a.getValue()); ■ Konkrete Klassen anstelle von Interfaces => XML-Knoten nicht durch Node repräsentiert (=> spezifische Klasse) // Kinderelemente for (Element e: root.getChildren()) println("- Element "+e.getName()); ■ Analoge Methoden zum Manipulieren, Validieren => vgl. DOM 1.11 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ ■ Keine lästige Typprüfung nötig => vgl. DOM 1.12 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 6 dom4j 6.1 Beispiel ■ http://www.dom4j.org/ ■ Implementierung ■ Baumdarstellung des XML Dokuments // Erzeugen des Parsers SAXReader reader = new SAXReader(); Document document = reader.read(__PFAD_ZUR_DATEI__); ■ Schneller/kleiner als JDOM ◆ Besonders schnelle Traversierung großer Dokumente // Wurzelknoten Element root = document.getRootElement(); ■ Auf Interfaces aufbauende Implementierung // Iterieren durch die Kinderelemente for ( Iterator i = root.elementIterator(); i.hasNext(); ) { Element element = (Element) i.next(); ... } ■ XPath-Integration ◆ Leichteres Navigieren // JDOM: e.getChild("kind").getChild("enkel"); // dom4j: e.selectSingleNode("kind/enkel"); ■ XSLT Integration => Transformation eines Dokuments © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.13 1.14 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 7 Streaming API for XML (StAX) 7.1 Beispiel ■ Streambasiertes XML-Pull-Parsing ■ Implementierung ◆ SAX: Push-Parsing (Observer Entwurfsmuster) URL u = new URL(__PFAD_ZUR_DATEI__); InputStream in = u.openStream(); XMLInputFactory factory = XMLInputFactory.newInstance(); XMLStreamReader parser = factory.createXMLStreamReader(in); ◆ Iterator Entwurfsmuster => Client fragt den Parser nach der nächsten vorhandenen Information ◆ Zustandsloser Strom ohne Navigationsmöglichkeit (vgl. SAX) ■ JSR-173 ◆ Java-API unabhängig von der Implementierung ■ Ermöglicht auch die Erzeugung von XML Dokumenten ◆ vs. SAX 1.15 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ for (int event = parser.next(); event != XMLStreamConstants.END_DOCUMENT; event = parser.next()) { switch (event) { case XMLStreamConstants.START_ELEMENT: ... case XMLStreamConstants.END_ELEMENT: System.out.println(parser.getLocalName()); break; case XMLStreamConstants.CDATA: ... case XMLStreamConstants.CHARACTERS: System.out.println(parser.getText()); break; } } parser.close(); 8 Validierendes Parsen 9 XML Tranformationen ■ Möglichkeiten ■ Extensible Stylesheet Language Transformations (XSLT) ◆ Document Type Definition (DTD) ◆ XSLT Stylesheets enthalten Transformationsanweisungen ◆ XML Schema ◆ XSLT Prozessoren transformieren anhand der Stylesheets ■ Schemavalidierung am Beispiel von SAX: ■ Java API for XML Processing (JAXP) ◆ Standard-API für XML Prozessoren: javax.xml.transform.** DefaultHandler hr = new Handler(); XMLReader xr = XMLReaderFactory.createXMLReader(); xr.setFeature(http://xml.org/sax/features/validation, true); ■ Einfaches Beispiel xr.setFeature(http://apache.org/xml/features/validation/schema, true); Source xmlSource = new StreamSource(xmlFile); Source xsltSource = new StreamSource(xsltFile); xr.setContentHandler(hr); xr.setErrorHandler(hr); ... FileReader r = new FileReader(filepath); xr.parse(new InputSource(r)); © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.16 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ TransformerFactory transFact = TransformerFactory.newInstance(); Transformer trans = transFact.newTransformer(xsltSource); trans.transform(xmlSource, new StreamResult(System.out)); 1.17 1.18 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 10 Java Remote Method Invocation 10.1 Serverseite ■ Fernaufrufmechanismus für Java ■ Implementierung eines einfachen Hello World Beispiels ◆ Methodenaufruf an Objekten in anderen Java Virtual Machines => Lokal oder entfernt ◆ Schnittstelle public interface Hello extends java.rmi.Remote { public String sayHello() throws java.rmi.RemoteException; } ■ Erhalt der Aufrufsemantik von Java ◆ Primitive Datentypen und nicht exportierte RMI Objekte: Call-By-Value ◆ Exportierte RMI Objekte: Call-By-Reference ◆ Implementierung der Schnittstelle ■ Architektur: Client Server Stub Remote Reference Layer Skeleton Remote Reference Layer public class HelloImpl extends UnicastRemoteObject implements Hello { public String sayHello() throws java.rmi.RemoteException { return ’Hello World!’; } Transport Layer } 1.19 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.20 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 10.1 Serverseite 10.2 Registry und Clientseite ■ Main-Methode: ■ RMI Registry ◆ <java_path>/bin/rmiregistry[.exe] HelloImpl hello = new HelloImpl(); java.rmi.Naming.rebind("//<host>:<port>/Hello", hello); ◆ Darf keinen direkten Zugriff auf Classpath der Objekte haben => Codebase würde eliminiert => Client erhält Stub ohne Codebase-Annotation ■ Codebase zum dynamischen Laden von Code am Server: ■ Implementierung des Clients ◆ System.setProperties() ◆ VM-Property: java -Djava.rmi.server.codebase=<URL> Hello hello; hello = (Hello)java.rmi.Naming.lookup("//<host>:<port>/Hello"); System.out.println(hello.sayHello()); ■ Security Manager System.setSecurityManager(new java.rmi.RMISecurity Manager()) ◆ Policy-File mit Rechten grant { //permission java.security.AllPermission; permission java.net.SocketPermission ”localhost:1099”, ”connect, resolve, accept”; }; © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.21 1.22 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 10.3 Clientseitige Stellvertreter 11 JavaBeans ■ Stub-Generierung ■ Nicht zu verwechseln mit Enterprise Java Beans (EJB)!!! ◆ rmic [-keep] HelloImpl public java.lang.String sayHello()...{ if (useNewInvoke) { Object $result = ref.invoke(this, $method_sayHello_0, null, 1253370244719889472L); } else { java.rmi.server.RemoteCall call = ref.newCall( (RemoteObject)this,operations,0,interfaceHash); ref.invoke(call); ref.done(call); } } ■ Dynamische Proxies (ab Java 1.5) ■ JavaBeans API Specification ■ Ziel: Einfaches Komponentensystem ■ Eigenschaften ◆ Unterstützung von „Introspection“ ◆ Unterstützung von „Customization“ ◆ Unterstützung von „Events“ ◆ Unterstützung von „Properties“ ◆ Unterstützung von Persistenz (Serialization, Externalization) • Implementieren beliebige Typen • Generische Dispatch-Methode invoke(...) • JVM Parameter beim Starten des Servers: -Djava.rmi.server.ignoreStubClasses=true 1.23 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.24 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 11.1 Eigenschaften 11.1 Eigenschaften ■ Zugriff auf JavaBeans nur über Methoden möglich (Kapselung) ■ Indizierte Eigenschaften (Vektoren) ■ Lesender Zugriff: get<Property>() private int[] value; ■ Schreibender Zugriff: set<Property>() void setValue(int index, int value); int getValue(int index); private int value; void setValue(int values[]); int[] getValue(); void setValue(int value); int getValue(); ■ Boolsche Eigenschaften private boolean value; void setValue(boolean value); boolean isValue(); 1.25 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.26 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 11.1 Eigenschaften 11.1 Eigenschaften ■ Gebundene Eigenschaften ■ Veto-Eigenschaften void addPropertyChangeListener(PropertyChangeListener x); void removePropertyChangeListener(PropertyChangeListener x); void addVetoableChangeListener(VetoableChangeListener x); void removeVetoableChangeListener(VetoableChangeListener x); ■ Unterstützung „einschalten“ ■ Unterstützung „einschalten“ private PropertyChangeSupport changes = new PropertyChangeSupport(this); private VetoableChangeSupport vetos = new VetoableChangeSupport(this); void addPropertyChangeListener(PropertyChangeListener l) { changes.addPropertyChangeListener(l); } void removePropertyChangeListener(PropertyChangeListener l){...} void addVetoableChangeListener(VetoableChangeListener l) { vetos.addVetoableChangeListener(l); } void removeVetoableChangeListener(VetoableChangeListener l){...} void setValue(int value){ this.value = value; changes.firePropertyChange(’value’, oldValue, newValue); } public void setValue(int value) throws PropertyVetoException { int oldValue = this.value; vetos.fireVetoableChange(’value’, oldValue, value); this.value = value; } 1.27 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.28 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 11.1 Eigenschaften 11.2 Packaging ■ Filter (Optional) ■ Java Archive (JAR) void addPropertyChangeListener(String propertyName, PropertyChangeListener listener); void removePropertyChangeListener(String propertyName, PropertyChangeListener listener); void addVetoableChangeListener(String propertyName, VetoableChangeListener listener); void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener); ■ Spezielles Manifest (META-INF/MANIFEST.MF) ◆ Meta-Informationen über das Archiv Name: avid/example/bean.class Java-Bean: True Depends-On: avid/example/bean2.class ■ Explizite Spezifikation mit BeanInfo Klasse ◆ Listet „Leistungen“ nach Außen explizit auf (Descriptoren) ◆ z.B. Zuordnung von Icons für Beans ◆ Später mehr... 1.29 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.30 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12 Java Management Extensions (JMX) 12.1 Architektur ■ JavaBeans Anwendung ■ JMX Instrumentation and Agent Specification, v1.2 ■ Java auf dem Server ◆ Überwachung zur Laufzeit ◆ JMX bietet einheitliche Schnittstelle (vorher proprietäre Lösungen...) ■ Entstanden im Rahmen von JSR 3 (IBM, Bea Systems, Borland, etc.) ◆ JMX als Standard in Java 1.5 (JSR 176) ■ Anforderungen an Anwendungen sind minimal 1.31 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.32 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12.1 Architektur 12.2 MBeans ■ Instrumentation Level ■ MBean ◆ Zu überwachende Resourcen ◆ Repräsentiert überwachbare Ressource ◆ Repräsentiert durch MBeans ◆ Management-Schnittstelle für MBean Server ◆ Benachrichtigungsmechanismus zum Informationsaustausch zwischen MBeans • Attribute • Operationen • Benachrichtigungen ■ Agent Level • Konstruktor ◆ Agenten sprechen zu verwaltende Ressourcen direkt an ◆ Stellen diese entfernten Anwendungen zur Verfügung ■ 4 Typen ◆ MBeans registrieren sich am MBean Server ◆ Standard MBean ◆ Dynamic MBean ■ Distributed Services Level ◆ Model MBean ◆ Entferntes Management: Protokoll-Adapter, Standard Konnektoren ◆ Open MBean 1.33 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.34 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12.2 MBeans 12.2 MBeans ■ Standard MBean ■ Dynamic MBean ◆ Einfachste Möglichkeit ◆ Dynamische Management Schnittstelle ◆ Statisches Management Interface ◆ Implementiert javax.management.DynamicMBean ◆ Suffix MBean public interface DynamicMBean { public Object getAttribute(String attribute) throws (...); public void setAttribute(Attribute attribute) throws (...); public AttributeList getAttributes(String[] attributes); public interface JMXTestMBean { public void sayHello(); public int getValue(); public void setValue(int value); } public AttributeList setAttributes(AttributeList attributes); public Object invoke(String actionName, Object params[], String signature[])throws (...); public MBeanInfo getMBeanInfo(); } dMBeanInfo = new MBeanInfo(dClassName, dDescription, dAttributes, dConstructors, dOperations, dNotifications); 1.35 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.36 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12.2 MBeans 12.3 Beispiel ■ Model MBean ■ Standard MBean ◆ Erweiterung der Dynamic MBean public interface JMXTestMBean { ◆ Interface javax.management.PersistentMBean public void sayHello(); ◆ Zusätzlich load() und store() Methoden public String getName(); public int getValue(); public void setValue(int value); ■ Open MBean ◆ Mechanismus, neue Objekte zur Laufzeit zu verstehen und zu verwenden } ◆ Implementiert javax.management.DynamicMBean public static void main(String[] args) { MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); ObjectName name = new ObjectName("avid.u1:type=JMXTest"); JMXTest mbean = new JMXTest(); mbs.registerMBean(mbean, name); ◆ Open: • Signaturen basieren auf kleiner Menge Java-Typen (Void, Integer, Byte, ...) • Veröffentlichen OpenMBeanInfo Objekt • Sofortige Verwendung ohne Neuübersetzung abhängiger Klassen // warten... Thread.sleep(Long.MAX_VALUE); } 1.37 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.38 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12.4 Benachrichtigungen 12.4 Benachrichtigungen ■ vgl. Java Beans ■ vgl. Java Beans ◆ Klasse erbt von NotificationBroadcasterSupport private long sequenceNumber = 1; public class JMXTest extends NotificationBroadcasterSupport implements JMXTestMBean { public void setValue(int value) { int oldValue = this.value; this.value=value; public MBeanNotificationInfo[] getNotificationInfo() { String[] types = new String[] { AttributeChangeNotification.ATTRIBUTE_CHANGE }; Notification n = new AttributeChangeNotification(this, sequenceNumber++, System.currentTimeMillis(), "Value changed", "Value", "int", oldValue, this.value ); sendNotification(n); String name; name = AttributeChangeNotification.class.getName(); String descript = "Attribute of this MBean has changed"; MBeanNotificationInfo info = new MBeanNotificationInfo(types, name, descript); return new MBeanNotificationInfo[] {info}; } ◆ Informationen über mögliche Notification Listener } 1.39 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.40 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 12.5 Ausführung 13 Aufgaben ■ Wichtig: ■ Implementierung eines einfachen SAX-Parsers ◆ Starten mit JVM-Parameter -Dcom.sun.management.jmxremote ◆ Verwenden des DefaultHandler ◆ Management mit jconsole (<JDK_HOME>/bin) ◆ Ausgabe der Namespaces ◆ Ausgabe Präfixe ◆ Ausgabe Events ◆ Validierung ■ Implementierung eines einfachen DOM-Parsers ◆ Ausgabe der Knotentypen ◆ Ausgabe der Attribute ■ Welchen Parser sollte in welcher Situation verwendet werden? ◆ z.B. bei großen Dokumenten, Zugriff über Netzwerk 1.41 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 1.42 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/ 13 Aufgaben ■ Java RMI ◆ Implementierung eines einfachen Zeitservers: Methode getTime() gibt aktuelle Uhrzeit zurück • Mit/ohne Stub-Erzeugung ◆ Variante: getTime() gibt Uhrzeitobjekt zurück • Java Objekt • Exportiertes Java RMI-Objekt ■ Java Management Extensions (JMX) ◆ Beispiel aus Übung selbst ausprobieren ◆ Dynamic MBean Implementierung anschauen http://java.sun.com/j2se/1.5.0/docs/guide/jmx/examples.html 1.43 © 2007, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u1.fm, 2007-04-23 14.54] http://www-vs.informatik.uni-ulm.de/teach/ss07/avid/