5. September 2010  
  Suche:
 
  Basics
  Code-Galerie
  Forum
  FAQ
  Tipps & Tricks
  Literatur
  Knowledge Base
  Workshops
  JSP-Hosting
  JSP-Engines
  Jobbörse
  Links
  JSP-Sites
  Newsletter
  JSP-Test
  Impressum
  Username:
  
  Passwort:
  
  

  Jetzt registrieren
  Warum registrieren?

  Valid HTML 4.01!
  Valid CSS!

JSP meets Middleware (RMI)

von shark,  14.07.2001 15:31:08  (9 votes)  [vote]
Neben CORBA ist RMI (Remote Method Invocation) eine gute Alternative für die Realisierung von verteilten Anwendungen. RMI hat eine sehr enge Bindung an die Programmiersprache Java und kann nicht wie CORBA mit anderen Programmier-sprachen verwendet werden. CORBA und RMI basieren auf dem Prinzip der entfernten Prozeduraufrufe (Remote Procedure Calls). Das Prinzip der entfernten Prozeduraufrufe (Kommunikation von Client zu Server über Stubs) wurde im CORBA Teil der Artikelserie bereits beschrieben und trifft auch für RMI zu.

Damit zwei Programme über das Netzwerk miteinander kommunizieren können benötigt, man wie bei CORBA Systemen einen ORB. Im Falle von RMI ist es der Service "rmiregistry", der Teil des JDKs ist. Ein RMI-Server meldet sich bei der RMI-Registry an und veröffentlicht seine Methoden, die er als Services bereitstellt, damit ein RMI-Client auf die Services zugreifen kann.

Ein RMI Programm schreibt man folgendermaßen:
------------------------------------------------------------------------

- Definition der Schnittstelle zwischen dem Client und dem Server

- Entwicklung des Servers und Implementierung des Dienstes, der Server meldet den Dienst an und verwaltet den Dienst

- Realisierung des Clients, welcher den Dienst des Servers benutzt

Schnittstelle zwischen dem Client und dem Server:
-------------------------------------------------------------------------
package RemoteHelloWorld;

import java.rmi.*;

public interface RemoteHello extends Remote
{
  public String getHello() throws RemoteException;
}

Server der den Dienst "getHello()" anbietet:
--------------------------------------------------------------
package RemoteHelloWorld;

import java.rmi.*;
import java.rmi.server.*;

public class HelloServer extends UnicastRemoteObject implements RemoteHello
{
  // Standard Konstruktor
  public HelloServer() throws RemoteException
  {
    super();   
  }
   
  // Hello World Service   
  public String getHello()
  {
    return("Hello World!");
  }
 
  // Server Hauptroutine
  public static void main(String args[])
  {
    try
    {
      // Security Manager erzeugen und setzen   
      RMISecurityManager oSecManager = new RMISecurityManager();
      System.setSecurityManager(oSecManager);
     
      // Server Instanz erzeugen
      HelloServer oHelloServer = new HelloServer();
     
      // Server bei der Registry anmelden
      Naming.rebind("GetHello", oHelloServer);
     
      System.out.println("Hello Server wartet auf Anfragen");
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }
}

Der Server stellt den Dienst "getHello()", den ein Client aufrufen kann, zur Verfügung. In der Hauptroutine des Servers wird ein SecurityManager erzeugt. Der SecurityManager unterstützt das Laden der dynamischen Objekte und die Anmeldung an der RMI-Registry (Socket Access). Die Zugriffsrechte werden über eine Policy-Datei definiert, die beim Start des Servers angegeben werden muss.

Policy-Datei (rmi.policy):
-----------------------------------
grant

  permission java.net.SocketPermission "*", "accept,listen,connect,resolve";
};

Der Client ist eine Java Klasse, die in eine JSP Seite eingebunden werden kann. Der Client setzt sich aus zwei Methoden zusammen: "connectServer()" und "getHello()".

Client der in einer JSP-Seite aufgerufen werden kann:
----------------------------------------------------------------------------
package RemoteHelloWorld;

import java.rmi.*; 
import java.rmi.server.*;

public class HelloClient
{
  // Remote Interface   
  private RemoteHello oHello;
     
  // Verbindung zum RMI Server aufbauen   
  public void connectServer()
  {   
    try
    {
      // Service ermitteln
      oHello = (RemoteHello) Naming.lookup("//localhost/GetHello");   
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
  }
 
  // Methode des Clients zum Aufrufen der Service Methode
  public String getHello()
  {
    String strHelloWorld = null;
   
    try
    {
      // Service aufrufen
      strHelloWorld = oHello.getHello();         
    }
    catch(Exception ex)
    {
      ex.printStackTrace();
    }
   
    // Rueckgabe des Ergebnisses
    return(strHelloWorld);
  }
}

Im Client wird kein SecurityManager benötigt. Das Lookup wird über die Methode "Naming.lookup(..)" durchgeführt. Wenn der Server nicht auf der gleichen Maschine wie der Client läuft, muss der String "localhost" durch den Namen der Maschine auf dem der Server läuft ersetzt werden. Der Service "getHello" wird im Server unter dem Namen "GetHello" bei der RMI-Registry registriert.

JSP-Seite:
---------------
<%@ page language= "java" contentType="text/html"%>
<%@ page import = "RemoteHelloWorld.HelloClient"%>
<%
  try
  {
    // Client Objekt erzeugen
    HelloClient oHelloClient = new HelloClient();   

    // Verbindung zum Server aufbauen
    oHelloClient.connectServer(); 

    // Aufruf der Service Methode und Ausgabe des Eregbnisses
    out.println(oHelloClient.getHello());
  }
  catch(Exception ex)
  {
    ex.printStackTrace();
  }
%>

Nachdem man die Java Klassen realisiert hat (Interface, Server und Client), übersetzt man die Dateien in Java Klassendateien (javac *.java). Nach dem Übersetzungsvorgang erzeugt man mit dem Werkzeug "rmic" die entsprechenden Stubs für die Kommunikation über das Netzwerk.

Aufruf:
----------
rmic -d . RemoteHelloWorld.RemoteServer

Nach dem Aufruf werden die zwei Klassendateien (Stub und Skeleton) für die Kommunikation über das Netzwerk erzeugt ("HelloServer_Stub.class" und "HelloServer_Skel.class").

Die Klassendateien (Interface, Server, Client, Stub, Skeleton) müssen im Classpath unter dem Packageverzeichnis liegen, in unserem Fall ist es das Verzeichnis "RemoteHelloWorld".

Nach dem Übersetzen startet man das RMI-System in einer DOS-Box:
------------------------------------------------------------------------------------------------------

(1) start rmiregistry

(2) start java -Djava.security.policy=rmi.policy RemoteHelloWorld.HelloServer

(3) Nach dem Starten des Servers kann die JSP-Seite im Browser ausgeführt werden. Das Ergebnis im Browser sollte die Ausgabe "Hello World!" sein.

Die JSP-Seite muss, um ausgeführt zu werden, im virtuellen Verzeichnis des WEB-Servers liegen.

Dieses Beispiel zeigt, wie über RMI mit entfernten Servern kommuniziert werden kann. RMI öffnet auch den Weg in die CORBA Welt, weil Sun Microsystems (TM) eine "RMI over IIOP" Bridge realisiert hat. Die "RMI over IIOP" Bridge ermöglicht es auch, dass von einer nicht Browser Anwendung auf CORBA-Services zugegriffen werden kann. Weitere Informationen hierzu findet man über die Links: http://java.sun.com/rmi und http://java.sun.com/rmi-iiop
[Druckansicht]    [Beitrag versenden]
<< zurück  Kommentieren


Hinweis: Auf dieser Seite liegen Links zu anderen Seiten im Internet. Für alle diese Links gilt: Wir betonen ausdrücklich, daß wir keinerlei Einfluß auf die Gestaltung und die Inhalte der gelinkten Seiten haben. Deshalb distanzieren wir uns hiermit ausdrücklich von allen Inhalten aller gelinkten Seiten auf dieser Homepage und machen uns ihre Inhalte nicht zueigen. Diese Erklärung gilt für alle auf unserer Homepage angebrachten Links

Redaktion/Betreiber von JSP-Develop übernehmen keinerlei Gewährleistung und Verantwortung für die Richtig- und/oder Vollständigkeit von den auf den Webseiten JSP-Develop veröffentlichten Source Codes. Die Verantwortung der Verwendung/Anwendung sowie etwaige Modifikation der hier veröffentlichten Sourcen obliegt einzig dem Benutzer der Webseite, welche die veröffentlichten Sourcen in einer Applikation/Anwendung einsetzt. Durch das Kopieren und/oder Benutzen der Sourcen in einer Applikation/Anwendung bzw. etwaigen Abschriften wird dieser Rechtshinweis anerkannt.

Java, JSP, JavaServer Pages, J2EE, EJB, JDBC, JNDI, JTA, Sun, Sun Microsystems are trademarks or registered trademarks of Sun Microsystems, Inc. in the United States and in other countries. IBM, WebSphere are trademarks or registered trademarks of International Business Machines Corporation. Other trademarks and registered trademarks are the property of their respective owners.