1 Überblick ■ Java Remote Method Invocation ■ Java Beans Architekturen für verteilte Internetdienste ■ Java Management Extensions Übung 2: Java RMI, Java Beans und Java Management Extensions (JMX) [email protected] © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2 Java Remote Method Invocation 2 Java Remote Method Invocation ■ Fernaufrufmechanismus für Java ■ Implementierung eines einfachen Hello World Beispiels ◆ Interface ■ Erhalt der Java Aufrufsemantik public interface Hello extends java.rmi.Remote { public String sayHello() throws java.rmi.RemoteException; } ◆ Primitive Datentypen und nicht exportierte RMI Objekte: Call-By-Value ◆ Exportierte RMI Objekte: Call-By-Reference ◆ Implementierung ■ 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 } 2.1 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.2 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2 Java Remote Method Invocation 2 Java Remote Method Invocation ■ 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: ◆ System.setProperties() ■ Implementierung des Clients ◆ 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”; }; 2.3 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.4 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2 Java Remote Method Invocation 3 Java Beans ■ Stub-Generierung ■ Nicht verwechseln mit Enterprise Java Beans (EJB)!!! ◆ rmic [-keep] HelloImpl ■ JavaBeans API Specification ■ Ziel: Einfaches Komponentensystem 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); } } ■ Eigenschaften ◆ Unterstützung von „Introspection“ ◆ Unterstützung von „Customization“ ◆ Unterstützung von „Events“ ◆ Unterstützung von „Properties“ ◆ Unterstützung von Persistenz (Serialization, Externalization) ■ Dynamische Proxies (ab Java 1.5) • Implementieren beliebige Typen • Generische Dispatch-Methode invoke(...) • JVM Parameter beim Starten des Servers: -Djava.rmi.server.ignoreStubClasses=true © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.5 2.6 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 3 Java Beans 3 Java Beans ■ Eigenschaften ■ Indizierte Eigenschaften (Vektoren) ◆ Zugriff nur über Methoden möglich (Kapselung) ◆ 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); int isValue(); 2.7 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.8 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 3 Java Beans 3 Java Beans ■ 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; } 2.9 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.10 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 3 Java Beans 3 Java Beans ■ Filter (Optional) ■ Packaging void addPropertyChangeListener(String propertyName, PropertyChangeListener listener); void removePropertyChangeListener(String propertyName, PropertyChangeListener listener); ◆ Java Archive (JAR) ◆ Spezielles Manifest (META-INF/MANIFEST.MF) Name: avid/example/bean.class Java-Bean: True Depends-On: avid/example/bean2.class void addVetoableChangeListener(String propertyName, VetoableChangeListener listener); void removeVetoableChangeListener(String propertyName, VetoableChangeListener listener); ■ Explizite Spezifikation mit BeanInfo Klasse ◆ Listet „Leistungen“ nach Außen explizit auf ◆ Zuordnung von Icons für Beans ◆ Später mehr... 2.11 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.12 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions (JMX) 4 Java Management Extensions ■ Java auf dem Server ■ Architektur (aus Java Management Extensions Instrumentation and Agent Specification, v1.2) ◆ Überwachung zur Laufzeit ◆ JMX bietet einheitliche Schnittstelle (nicht proprietär) ■ Entstanden im Rahmen von JSR 3 (IBM, Bea Systems, Borland, etc.) ■ JSR 176: JMX als Standard in Java 1.5 ■ Anforderungen an Anwendungen sind minimal 2.13 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.14 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions 4 Java Management Extensions ■ Architektur ■ MBean ◆ Instrumentation Level ◆ Repräsentiert überwachbare Ressource ◆ Management-Schnittstelle für MBean Server • Zu überwachende Resourcen • Repräsentiert durch MBeans • Attribute • Benachrichtigungsmechanismus zum Informationsaustausch zwischen MBeans • Operationen • Benachrichtigungen • Konstruktor ◆ Agent Level • Agenten sprechen zu verwaltende Ressourcen direkt an ◆ 4 Typen • Stellen diese entfernten Anwendungen zur Verfügung • Standard MBean • MBeans registrieren sich am MBean Server • Dynamic MBean • Model MBean • Open MBean ◆ Distributed Services Level • Entferntes Management: Protokoll-Adapter, Standard Konnektoren 2.15 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.16 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions 4 Java Management Extensions ■ 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); 2.17 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.18 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions 4 Java Management Extensions ■ Model MBean ■ Beispiel (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.u2: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 Thread.sleep(Long.MAX_VALUE); } 2.19 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.20 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions 4 Java Management Extensions ■ Benachrichtigungen (vgl. Java Beans) ■ Benachrichtigungen (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}; } } 2.21 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.22 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 4 Java Management Extensions 5 Aufgaben ■ Wichtig: ■ Java RMI ◆ Starten mit JVM-Parameter -Dcom.sun.management.jmxremote ◆ Implementierung eines einfachen Zeitservers: Methode getTime() gibt aktuelle Uhrzeit zurück ◆ Management mit jconsole (<JDK_HOME>/bin) • Mit/ohne Stub-Erzeugung ◆ Variante: getTime() gibt Uhrzeitobjekt zurück • Java Objekt • Exportiertes Java RMI-Objekt ■ Java Beans ◆ VetoableChangeListener vs. Event Listener Interface ■ Java Management Extensions (JMX) ◆ Beispiel aus Übung online (selbst ausprobieren) ◆ Dynamic MBean Implementierung http://java.sun.com/j2se/1.5.0/docs/guide/jmx/examples.html 2.23 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/ 2.24 © 2006, Holger Schmidt, Verteilte Systeme, Univ. Ulm, [u2.fm, 2006-05-12 08.55] http://www-vs.informatik.uni-ulm.de/teach/ss06/avid/