Local- / Remoteinterfaces per Konfiguration nutzen

Die üblichen Beispiele für EJB3-Programmierung sehen normalerweise vor, dass man sich bereits zur Implementationszeit für eine remote bzw. lokale Referenzierung einer Bean entscheidet. Dazu wird einfach das entsprechende Interface per Annotation mit der Bean verbunden.

@EJB
HalloRemote halloBean;
...
void greet()
{
    halloBean.sayHello();
}

Wenn jetzt beide Beans in einem EAR deployed werden, möchte man aber ggf. lieber auf das Local Interface zurückgreifen. Bei einigen Applikationservern ist das kein Unterschied. Sie merken, wenn sie einen Remote Call sparen können und rufen die entsprechende Bean direkt auf (z.B. WebSphere). Für Applikationserver die das nicht können, wäre es aber recht praktisch, wenn man beim Erstellen des EARs per Konfiguration einstellen könnte, ob eine Referenz remote oder lokal ist.

Das funktioniert mit folgendem portablen Konstrukt:

Basisinterface für Remote und Local

classdiagram

Hier erweitern einfach das Remote- sowie das Local Interface ein Basisinterface. In der aufrufenden Bean kann dann einfach das Basisinterface referenziert werden:

@EJB(name="halloBean")
Hallo halloBean;
...
void greet()
{
    halloBean.sayHello();
}

Da intern noch etwas Magie erforderlich ist mit der Auflösung der Home-Interfaces (die sind in EJB3 nur versteckt, nicht verschwunden), muss der Applikationserver noch darüber informiert werden, ob man in dem Kontext jetzt eine remote oder eine lokale Referenz wünscht. Das geht z.B. in der ejb-jar.xml

<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar xmlns = "http://java.sun.com/xml/ns/javaee"
         version = "3.0"
         xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
         http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">

    <enterprise-beans>
        <session>
            <ejb-name>HelloCaller</ejb-name>
            <ejb-ref>
                <ejb-ref-name>halloBean</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <remote>test.HalloRemote</remote>
            </ejb-ref>
        </session>
    </enterprise-beans>
</ejb-jar>

oder für das lokale Interface statt ejb-ref:

            <ejb-local-ref>
                <ejb-ref-name>halloBean</ejb-ref-name>
                <ejb-ref-type>Session</ejb-ref-type>
                <local>test.HalloLocal</local>
            </ejb-local-ref>

Damit wird dann das Localinterface referenziert.

Bei einem Glassfish Applikationserver könnte man die Remote Referenz in der sun-ejb-jar.xml noch direkt auf einen anderen Applikationserver umleiten – ein WebService über RMI also:

<ejb-ref>
    <ejb-ref-name>halloBean</ejb-ref-name>
    <jndi-name>corbaname:iiop:hostip:3700#test.HalloRemote</jndi-name>
</ejb-ref>

Das ganze funktioniert natürlich analog mit der web.xml.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *


6 + vier =