Jini in Java


...[Seminar Linux, WWW, Java und Internet]...[Thema Jini]...[Begriffserklärungen]...[Anwendungsbeispiele]

Übersicht Jini in Java:

Voraussetzungen

Jini läuft unter den folgenden Betriebssystemen: Jini ist eine Erweiterung der Java-Plattform und basiert auf der Technik von Java 2.

Um das Ausführen der Services vom Client aus möglich zu machen benutzt Jini das Java Remote Method Invocation (RMI). Um Dateien und Code (z.B. Class-Files) zu übertragen wird in der Regel auch noch ein HTTP-Server benötigt (falls nicht schon vorhanden wird mit Jini ein rudimentärer HTTP-Server mitgeliefert).
Basis für die Sicherheit ist das Security Model der JDK 1.2 um mit dem SecurityManager den Zugriff auf Resourcen freizugeben oder zu beschränken.


Discovery

Ein Client sucht einen Service über den Lookup Service. Ein Service muss sich im Lookup Service registrieren. Beide müssen allerdings zuerst den Lookup Service finden. Das geschieht über das Discovery.
Ist die Adresse des Lookup Service bekannt wird ein Unicast Discovery benutzt. Die Klasse hierfür heißt LookupLocator. Die Klasse besitzt zwei Konstruktoren:

package net.jini.core.discovery;

public Class LookupLocator {

    LookupLocator(java.lang.String url)
                  throws java.net.MalformedURLException;
    LookupLocator(java.lang.String host,int port);
}

Hier findet noch Discovery statt. Im ersten Fall wird nur die Syntax der URL überprüft und zweiten Fall nicht einmal das. Methoden von LookupLocatorsind:

String getHost();
int getPort();

Bei bekannter Adresse bekommt man hier natürlich keine neuen Information.

Die Methode getRegistrar erhält vom Lookup Service ein Objekt der Klasse ServiceRegistrar.

public ServiceRegistrar getRegistrar()
                              throws java.io.IOException,
                                     java.lang.ClassNotFoundException

Das ServiceRegistrar ist eine Abstrakte Klasse die vom Lookup Service implementiert wird. Es übernimmt die Rolle eines Proxys für den Lookup Service und ist das erste Object, das von einem Javaprozess (Lookup Service) zu einem anderen (Service oder Client) gesendet wird.


Service Registration

Über das ServiceRegistrar ist es dem Service möglich sich beim Lookup Service zu registrieren:

public ServiceRegistration register(ServiceItem item,
                                    long leaseDuration)
                             throws java.rmi.RemoteException

Es kann hier zwar die leaseDuration angegeben werden, endgültig entschieden über das Intervall, in dem das Lease erneuert werden muss, wird aber beim Lookup Service.
Wichtig ist hingegen der Parameter ServiceItem.

package net.jini.core.lookup;

public Class ServiceItem {
    public ServiceID serviceID;
    public java.lang.Object service;
    public Entry[] attributeSets;

    public ServiceItem(ServiceID serviceID,
                   java.lang.Object service,
                   Entry[] attrSets);
}

ServiceID ist eine 128-Bit Zahl, die den Service weltweit eindeutig identifizieren soll. Vergeben wird der Wert vom Lookup Service. Besitzt der Service bereits eine ServiceID, dann soll er bei einer erneuten Registrierung wieder benutzen.
Der zweite Parameter ist das Objekt, das registriert wird. Das Objekt wird serialisiert und an den Lookup Service gesendet zu Verwaltung. Dieses Objekt wird später vom Client geladen und benutzt, um den Service anzuwenden.
Der dritte Parameter soll den Service weiter beschreiben, damit ein Client ihn leichter aussuchen kann.

Die letzte Methode die der Service benutzen muss ist getLease(). Dadurch erhält er vom Lookup Service ein Lease-Objekt, das im erlaubt sein Lease zu erneuern oder abzubrechen.

Beispielcode für Service Registration: SimpleService.txt


Client Search

Nachdem der Client über getRegistrar ein ServiceRegistrar erhalten hat, benutzt er die folgende Methode, um einen Service zu suchen:

public java.lang.Object lookup(ServiceTemplate tmpl)
                        throws java.rmi.RemoteException;

Die Klasse ServiceTemplate beschreibt den Service und sieht dabei wie folgt aus:

package net.jini.core.lookup;

public Class ServiceTemplate {
    public ServiceID serviceID;
    public java.lang.Class[] serviceTypes;
    public Entry[] attributeSetTemplates;

    ServiceTemplate(ServiceID serviceID,
                    java.lang.Class[] serviceTypes,
                    Entry[] attrSetTemplates);
}

Falls die serviceID bekannt ist, dann sollte sie hier benutzt werden, andernfalls ist der Wert Null.
Bei dem serviceTypes die gesucht werden, handelt es sich sinnvollerweise entweder

Wenn der Lookup Service ein passendes Objekt hat, sendet er dies an den Client, der es ausführen kann.



...[Seminar Linux, WWW, Java und Internet]...[Thema Jini]...[Jini in Java]...[Anwendungsbeispiele]