Architekturen für verteilte Internetdienste

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