Achtung: Die überarbeitete 2. Auflage zu Enterprise JavaBeans 3.0 ist erschienen.
Nähere Informationen unter www.ejbbuch.de


  Elsevier VerlagSpektrum Akademischer Verlag mgm technology partners GmbH (Firma der Autoren)  

Informationen zum Buch "Enterprise JavaBeans 2.0/2.1"
 
Die Quelltexte der Beispiele im Buch zum Herunterladen

Cover des Buches "Enterprise JavaBeans 2..0/2.1"

Neben den Java-Quelltexten aus dem Buch enthält das Archiv auch Konfigurationen für die J2EE-Server JBOSS, Orion, Oracle (OC4J) und BEA Weblogic. Zum Kompilieren, Deployen und Redeployen der EJB-Komponenten sowie zum Start deren Test-Clients stehen Ant-Skripte zur Verfügung.


Vorbereitungen

Die Beispiele sind getestet und vorbereitet für JBOSS 3.0/3.01, Orion 1.5.4/1.6, Oracle OC4J 9.0.2/9.0.3 und BEA Weblogic 7.0. (Andere J2EE-Server können gemäß dem im Folgenden dargestellten Konfigurationsschema allerdings sehr einfach hinzugefügt werden.)

Anforderungen

Die Beispiele laufen grundsätzlich auf jedem J2EE-Server mit EJB 2.0-Unterstützung. Dies sind zur Zeit neben den oben aufgeführten etwa WebSphere 5 von IBM, Borland Enterprise Server 5, BeanTransactions 3.0 von Fujitsu-Siemens Computer. Weitere Informationen zu J2EE/EJB-Servern finden Sie auf www.ejbsig.de, www.j2ee-develop.de, www.theserverside.com und www.javaskyline.com/serv.html.

  • JBOSS ist ein Open-Source J2EE-Server (www.jboss.org).

  • Orion ist ein vergleichsweise günstiger kommerzieller J2EE-Server, der für den privaten Gebrauch und für Entwickler kostenlos nutzbar ist (www.orionserver.com).

  • Oracle OC4J basiert auf dem Orion-Server, findet jedoch Verwendung im umfangreichen Oracle 9i Application Server (9iAS). Er ist jedoch separat erhältlich ("Oracle9iAS Containers for J2EE, Standalone") und für Entwickler ebenfalls kostenlos. (otn.oracle.com/software/products/ias/content.html - Registrierung notwendig)

  • BEA Weblogic ist neben IBM WebSphere zur Zeit der Marktführer. Er ist ein High-End-Server mit umfangreichen Features, allerdings auch entsprechend "teuer". Es steht jedoch eine zeitbeschränkte Vollversion zum Download zur Verfügung (commerce.bea.com/downloads/weblogic_server.jsp).

Neben einem J2EE-Server ist auch das Open-Source-Tool Ant (jakarta.apache.org/ant/) zu empfehlen, um die beigelegten Skripte nutzen zu können.

Anpassen der Umgebung

  • JBOSS:
    Die Umgebungsvariable JBOSS_DIST muss auf das Wurzelverzeichnis verweisen.
    Beispiel: F:\java\jboss-all\build\output\jboss-3.1.0alpha (Darin liegen bin, client etc.).

  • Orion:
    Die Umgebungsvariable ORION_HOME muss auf das Wurzelverzeichnis verweisen.
    Beispiel: F:\java\orion.

  • Oracle OC4J:
    Die Umgebungsvariable OC4J_HOME muss auf das Wurzelverzeichnis verweisen.
    Beispiel: F:\java\oc4j\j2ee\home.

  • Weblogic:
    Die Umgebungsvariable WL_HOME muss auf das Wurzelverzeichnis verweisen.
    Beispiel: G:\Programme\bea\weblogic700.


Aufruf der Ant-Buildfiles

Synposis der Aufrufe der Buildfiles

ant -f build_XXX YYY-ZZZ

  • XXX: der Name des Beispiels aus dem Buch (etwa "helloworld" etc., siehe unten).
  • YYY: der Name des J2EE-Servers. Zur Zeit werden unterstützt: "jboss", "orion", "oc4j" und "weblogic".
  • ZZZ: der auszuführende Befehl, etwa "build", "build-deploy" (Server) oder "build-run" (Client).

Ziele (Targets) der Buildfiles

Im Folgenden werden die Befehlsklassen am Helloworld-Beispiel und für den JBOSS-Server dargestellt. Völlig äquivalent funktioniert dies auch für die anderen Beispiele und Serverprodukte.

  • Erzeugen (Build) des Archivs für den J2EE-Server:
    ant -f build_helloworld.xml jboss-build

  • Erzeugen (Build) des Archivs und Deployment/Redeployment auf dem J2EE-Server:
    ant -f build_helloworld.xml jboss-build-deploy

  • Undeployment auf dem J2EE-Server:
    ant -f build_helloworld.xml jboss-undeploy

  • Erzeugen des Client-Archivs:
    ant -f build_helloworld.xml jboss-client-build

  • Starten des Clients-Archivs (es muss zuvor erzeugt werden!):
    ant -f build_helloworld.xml jboss-client-run

  • Erzeugen und Starten des Client-Archivs:
    ant -f build_helloworld.xml jboss-client-build-run


Verzeichnisstrukturen

Die Konfigurationsdateien für Ant liegen alle im Verzeichnis "./conf". Es umfasst drei generische Ant-Skript-Fragmente (die per "&ENTITY;" in das Ant-Skript eingefügt werden). Weiterhin gibt es hier für jeden J2EE-Server jeweils ein Unterverzeichnis, in dem sich spezifische Einstellungen und Ant-Targets finden, beispielsweise "./conf/weblogic".

Das Verzeichnis "./source" ist das Quelltextverzeichnisses. Die Pfadstruktur korrespondiert mit der Java-Package-Struktur der Beispiele: "ejbbuch.helloworld" liegt etwa im Pfad "./source/ejbbuch/helloworld".
Für jedes Beispiel gibt es ein eigenes Package und damit ein eigenes Verzeichnis. Neben den Java-Quelltextdateien liegen darin auch alle XML-Konfigurationsdateien (ejb-jar.xml, application.xml, application-client.xml). Weiterhin befindet sich dort stets ein Unterverzeichnis "conf" (etwa "./source/ejbbuch/helloworld/conf"), das wie oben jeweils ein Unterverzeichnis für jeden J2EE-Server besitzt. Darin liegen die serverspezifischen Konfigurationsdateien und ggf. die "jndi.properties"-Datei für den Client. So liegt etwa unter "./source/ejbbuch/helloworld/conf/weblogic" bei Bedarf die Datei "weblogic-ejb-jar.xml".


Serverspezifische Einstellungen

Alle diese Einstellungen finden sich unter ".conf/<J2EE-Server>/setup.xml". Dies umfasst zum Beispiel Usernamen/Passwort für den Deployment-Vorgang (Orion, OC4J), den Inhalt des Client-Classpath und Pfade in der Server-Installation. Die Details hängen vom J2EE-Server ab.

In den Unterverzeichnissen ".conf/<J2EE-Server>/server-conf/" finden sich zudem Server-Konfigurationsdateien bzw. Auszüge davon, die Sie übernehmen können. So gibt es etwa die Datei ".conf/weblogic/server-conf/config.xml", deren Inhalt man in die config-xml-Datei des Weblogic-Servers übernehmen kann, um die serverseitigen Einstellungen (Datasources, JMS-Destinations etc.) passend für die Beispiele vorzubereiten.

Weiterhin liegt in Abhängigkeit des J2EE-Servers auch die Datei "jndi.properties" in "./source/ejbbuch/<Beispiel>/conf/<J2EE-Server>". Darin sind für Orion und OC4J auch Username und Passwort angegeben, mit denen sich der Client authentifiziert.


Im Folgenden werden die nötigen Konfigurationen und ggf. Einschränkungen bzgl. der verschiedenen J2EE-Server dargestellt. Dazu gehen wir kapitelweise die Beispiele durch.

Hinweis zu den Datenbanken

Für Beispiele, die auf eine Datenbank zugreifen, ist jeweils die DDL-Anweisung angegeben, um die nötige Tabelle zu erzeugen. Dies ist bei CMP-Entity Beans allerdings nur bei Weblogic nötig.
Bei Orion, Oracle OC4J und JBOSS benutzt die Konfiguration der Einfachheit halber das Feature dieser Server, die Tabellen und das gesamte Mapping der CMP-Beans automatisch zu erzeugen ("Auto-Mapping/Table-Creation"): Bei Orion und Oracle OC4J wird dazu die erste DataSource verwendet, die in der Konfigurationsdatei "config/data-sources.xml" eingetragen ist. JBOSS verwendet dazu die DataSource mit dem Namen "DefaultDS".

Weiterhin werden Orion und JBOSS mit der Open-Source-Datenbank "HypersonicSQL" ausgeliefert, die auch als Standarddatenbank selektiert ist. Deshalb ist bei Orion und JBOSS praktisch keine Installation bzgl. der Datenbank zu treffen. Für Weblogic und Oracle OC4J sind exemplarische Konfigurationen mitgeliefert, um eine Oracle-Datenbank anzusprechen.

Beispieldaten

Zur Ausführung der folgenden Beispiele müssen die Datenbank-Tabellen nicht mit Daten vorinitialisiert werden. Die Beispiele , die auf die Datenbank zugreifen, erzeugen über den jeweiligen Testclient die nötigen Test-Daten durch Anlegen von bestimmten Entity-Objekten.

Legende:
SLSB = Stateless Session-Bean, SFSB = Stateful Session-Bean, BMP/CMP-EB = Entity-Bean mit Bean-/Container-Managed Persistence


Kapitel 2: Buch (TestClient -> SLSB -> CMP-EB)

Ant-Buildfile: build_buch.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle:
CREATE TABLE buch (
  isbn VARCHAR(16) NOT NULL PRIMARY KEY,
  titel VARCHAR(256),
  preis FLOAT
)


Kapitel 3: HelloWorld (TestClient -> SLSB)

Ant-Buildfile: build_helloworld.xml


Kapitel 4: Warenkorb (TestClient -> SFSB)

Ant-Buildfile: build_warenkorb.xml


Kapitel 6: Produkt (TestClient -> CMP-EB)

Ant-Buildfile: build_produkt.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle:
CREATE TABLE produkt (
  pid VARCHAR(32) NOT NULL PRIMARY KEY,
  bezeichnung VARCHAR(256),
  preis FLOAT
)

Problem bei Oracle OC4J: Das Beispiel lässt sich anscheinend nicht deployen. Es erscheint folgender Fehler:
Auto-deploying produkt (New server version detected)...
ProduktBean_PersistenceManager1.java:116: add(java.lang.Object) in java.util.Collection cannot be applied to (double)
response.add(set.getDouble(1));
        ^
1 error
com.evermind.compiler.CompilationException: Syntax error in source

Das Problem scheint wohl der Datentyp des Ergebnisses bei der ejbSelect-Methode zu sein (vgl. etwa Seite 163 im Buch). Es soll eine Collection von CMP-Attributwerten geliefert werden. Das CMP-Attribut ist als "double" deklariert -- normalerweise sollte der Container deshalb eine Collection von Double-Objekten zurückliefern (also eine Typ-Konversion durchführen). Diese Vorgehensweise ist allerdings in EJB 2.0 noch nicht ausdrücklich festgeschrieben, sondern wurde erst in die EJB 2.1-Spezifikation als verpflichtend aufgenommen.
Lösung: CMP-Attribut "preis" von double auf Double umstellen!


Kapitel 6: Kontakt (TestClient -> CMP-EB)

Ant-Buildfile: build_kontakt.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle:
CREATE TABLE kontakt (
  nachname VARCHAR(256) NOT NULL,
  telno VARCHAR(256) NOT NULL,
  vorname VARCHAR(256),
  PRIMARY KEY(nachname, telno)
)


Kapitel 6: Adresse (TestClient -> CMP-EB)

Ant-Buildfile: build_adresse.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle:
CREATE TABLE adresse (
  id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(255),
  strasse VARCHAR(255),
  wohnort VARCHAR(255)
)


Kapitel 6: Bestellwesen (TestClient -> Test-SLSB -> 5 CMP/CMR-EB)

Ant-Buildfile: build_bestellwesen

Dies ist ein komplexes und umfangreich kommentiertes Beispiel zu Container Managed Relationships und ejbSelect-Methoden: Das verwendete Beziehungsgeflecht der CMP-Entity Beans entspricht dem auf Seite 219 im Buch. Das Stateless Session-Bean "TestManager" demonstriert die Benutzung der Beans und ihrer Beziehungen (gesteuert von einem Testclient), wie in Kapitel 6.2 bis 6.4 im Buch dargestellt.

DDL-Statements zum Erzeugen der verwendeten Datenbank-Tabellen
CREATE TABLE bw_kunde (
  id NUMBER NOT NULL PRIMARY KEY,
  adresse_fk NUMBER
)
CREATE TABLE bw_adresse (
  id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(255),
  strasse VARCHAR(255),
  wohnort VARCHAR(255)
)
CREATE TABLE bw_bestellung (
  id NUMBER NOT NULL PRIMARY KEY,
  kunde_fk NUMBER
)
CREATE TABLE bw_bestellposition (
  id NUMBER NOT NULL PRIMARY KEY,
  anzahl NUMBER,
  bestellposition_fk NUMBER,
  produkt_fk VARCHAR(32)
)
CREATE TABLE bw_produkt (
  pid VARCHAR(32) NOT NULL PRIMARY KEY,
  bezeichnung VARCHAR(256),
  preis FLOAT
)

Problem bei Oracle OC4J: Das Beispiel lässt sich anscheinend nicht deployen. Dies liegt am selben Problem wie beim Beispiel "Produkt" (Kapitel 6): die double/Double-Erkennung bei Collection-wertigen ejbSelect-Methoden klappt nicht.
Lösung: CMP-Attribut "preis" von double auf Double umstellen!

Problem bei JBOSS: Mir ist es nicht gelungen, das Beispiel mit JBOSS 3.0.0/3.0.1 zu deployen -- es kam dabei immer eine NullPointerException. Mit der aktuellen Developer-Version 4.0.0alpha von JBOSS, die man vom CVS-Server herunterladen kann, funktioniert das Beispiel dagegen völlig problemlos.
www.jboss.org/developers/guides/quickstart.jsp erklärt, wie Sie die aktuelle Developer-Version herunterladen und installieren.


Kapitel 7: Konto (TestClient -> BMP-EB)

Ant-Buildfile: build_kontoBMP.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle (sie muss für alle J2EE-Server manuell angelegt werden):
CREATE TABLE konto (
  id INTEGER NOT NULL PRIMARY KEY,
  name VARCHAR(64),
  kontostand FLOAT NOT NULL
)


Kapitel 9: Newsticker (TestClient -> MDB -> CMP-EB)

Ant-Buildfile: build_newsticker.xml

DDL-Statement zum Erzeugen der verwendeten Datenbank-Tabelle:
CREATE TABLE newsticker (
  id NUMBER NOT NULL PRIMARY KEY,
  timestamp VARCHAR(256),
  agentur VARCHAR(256),
  autor VARCHAR(256),
  kategorie VARCHAR(256),
  titel VARCHAR(256),
  text VARCHAR(1024)
)

Weitere Konfiguration für JBOSS: In "<JBOSS_DIST>/server/default/deploy/jbossmq-destinations-service.xml" muss folgender Eintrag hinzugefügt werden:
<mbean code="org.jboss.mq.server.jmx.Topic"
    name="jboss.mq.destination:service=Topic,name=NewsTickerTopic">
  <depends optional-attribute-name="DestinationManager">
    jboss.mq:service=DestinationManager</depends>
  <depends optional-attribute-name="SecurityManager">
    jboss.mq:service=SecurityManager</depends>
  <attribute name="SecurityConf">
    <security>
      <role name="guest" read="true" write="true"/>
      <role name="publisher" read="true" write="true" create="false"/>
      <role name="durpublisher" read="true" write="true" create="true"/>
    </security>
  </attribute>
</mbean>

Problem bei JBOSS: Mir ist es nicht gelungen, eine "Durable"-Topic zu verwenden. Das Problem scheint wohl die HypersonicSQL-Datenbank zu sein. Denn sie unterstützt nicht das XA-Protokoll, das benötigt wird, wenn zwei oder mehrere Ressourcen an einer Transaktion teilnehmen (intern wird dabei ein 2-Phasen-Commit-Protokoll implementiert). Dies scheint aber nötig zu sein, wenn das Message-Driven Bean mit einer vom Container gestarteten Transaktion aufgerufen wird und dann ein CMP-Entity Bean aufruft (Datenbank als weitere Ressource). Der Ausweg wäre a) explizit auf XA zu verzichten, oder b) eine XA-fähige Datenbank bzw. DataSource zu verwenden, etwa Oracle, Interbase, PostgreSQL etc.
Um das Beispiel dennoch auch mit HypersonicSQL zum Laufen zu bringen, kann man einfach eine "NonDurable"-Topic verwenden. Dazu muss in der Datei "ejb-jar.xml" einfach die entsprechende Zeile geändert werden:
   <subscription-durability>NonDurable</subscription-durability>

Problem bei Oracle OC4J 9.03: Mir ist es nicht gelungen, das Beispiel zu deployen. Es kam stets die Fehlermeldung:
Error deploying file:/F:/java/oc4j/j2ee/home/applications/newsticker/newsticker.jar homes: JMS Error: Invalid topic
Mögliche Ursachen: falsches JDK (Oracle empfiehlt JDK 1.3) oder wohl wahrscheinlicher: es muss im Gegensatz zum ansonsten so ähnlichen Orion-Server ein JMS-Service-Provider oder eine spezielle Destination (Topic) vorbereitet werden. (OC4J unterstützt das Datenbank-basierte Oracle Advanced Queueing -- siehe auch otn.oracle.com/tech/java/oc4j/doc_library/902/ejb/mdb.htm.)

Weitere Konfigurationen bei Orion:

  • In "<ORION_HOME>/config/server.xml" einfügen, falls noch nicht vorhanden:
    <jms-config path="./jms.xml" />
  • In "<ORION_HOME>/config/jms.xml":
    • Eintrag für "Demo Topic" auskommentieren (<topic>...</topic>)
      Grund: JMS von Orion 1.6 scheint fehlerhaft; er erkennt nur eine Topic!?
    • Hinter dem auskommentierten Eintrag einfügen:
      <topic name="Newsticker Topic" location="topic/NewsTickerTopic">
        <description>Fuer das MDB TickerProcessor</description>
      </topic>
    • Wenn die Client-Sender-Anwendung Probleme mit der Authentifizierung hat, dann
      als ersten Eintrag hinzufügen (admin/mgm ggf. nach Bedarf ändern):
      <topic-connection-factory location="jms/theTopicConnectionFactory"
           username="admin" password="mgm"/>


Rechtliches

Die Autoren des Buches, die Firma MGM EDV-Beratung GmbH und der Spektrum-Verlag übernehmen weder Garantie noch die juristische Verantwortung oder irgendeine Haftung für die Nutzung der zur Verfügung gestellten Beispiele und Informationen, für deren Wirtschaftlichkeit oder fehlerfreie Funktion für einen bestimmten Zweck. Ferner können die erwähnten Personen für Schäden, die auf einer Fehlfunktion von Programmen oder ähnliches zurückzuführen sind, nicht haftbar gemacht werden. Auch nicht für die Verletzung von Patent- und anderer Rechten Dritter, die daraus resultieren. Eine telefonische oder schriftliche Beratung durch den Verlag über den Einsatz der angegebenen Programme ist nicht möglich.

Die Autoren des Buches, die Firma MGM EDV-Beratung GmbH und der Spektrum-Verlag übernehmen keine Gewähr dafür, dass die beschriebenen Programme frei von Schutzrechten Dritter sind. Die Wiedergabe von Gebrauchsnahmen, Handelsnamen, Warenbezeichnungen usw. auf diesen Web-Seiten und in den Quelltext-Archiven berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürfen.

 


Letzte Änderung: 18.05.2007 - Martin Backschat