Architekturen für verteilte Internetdienste

Werbung
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/
Herunterladen