Zugriff auf SessionBbean auf externem JBoss

derHarri

Grünschnabel
Hallo Jungs,

ich bin realtiv neu im dem Thema, also enthauptet mich bitte nicht für dämliche Fragen. Danke.
Ich habe eine sehr simple SessionBean geschrieben. Die konnte ich auch problemlos deployen. Zusätzlich habe ich einen Client geschrieben der darauf zugreifen soll. Der Client und der Server befinden sich auf unterschiedlichen Rechnern. Soweit ich das verstanden habe, muss ich mir einen IntialContext erzeugen und mittels lookup die EJB über seinen JNDI-Name aus der jboss.xml holen.

Code:
<?xml version="1.0" encoding="UTF-8"?>
<jboss>
    <enterprise-beans>
        <session>
            <ejb-name>HelloWorldBean</ejb-name>
            <jndi-name>helloEJB</jndi-name>
        </session>
    </enterprise-beans>    
</jboss>
Soweit OK?

Wenn ich nun also auf einen Context auf einem entferneten Rechner zugreifen möchte, müssen beim Erzeugen des Context zusätzliche parameter übergeben werden. Das habe ich wie folgt gemacht:


Code:
String urlName = "jnp://hulk:1099";
Properties p = new Properties();
p.put("javax.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.put("javax.naming.provider.url", urlName);           
p.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
InitialContext jndiContext = new InitialContext(p);
soweit scheint es noch zu klappen!?

Dann versuche ich das EJB-Objekt zu holen:
Code:
Object ref  = jndiContext.lookup("helloEJB");
Und genau hier knallts mit folgender Exception:

Code:
 javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
 at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:640)
 at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243)
 at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:280)
 at javax.naming.InitialContext.lookup(InitialContext.java:347)
 at HelloWorldClient.main(HelloWorldClient.java:49)
Wenn mir jemand einen Hinweis oder eine Erklärung hierfür geben könnte, wäre ich sehr dankbar. Denn sonst platzt bald mein Kopf.

Vielen Dank
Harri E.
 
Hallo!

leg auf dem Client einfach eine Datei mit dem Namen jndi.properties und dem folgenden Inhalt in den Classpath deines Clients:
Code:
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
java.naming.provider.url=jnp://DEIN_EXTERNER_SERVER:1099
Zusaetzlich solltest du das jbossall-client.jar in den Classpath deines Clients aufnehmen.

Gruss Tom
 
SUPER das hat geklappt. Danke für deine Hilfe!

Kannst du mir jetzt vielleicht sogar noch erklären wieso das so ging?
Die jbossall-client.jar hatte ich davor schon im Classpath, ich habe nur noch die jndi.properties ergänzt und siehe da.. wunderbar. Ich vermute mal, dass die Anwendung nun die Daten aus der Propertiesdatei ließt. Wieso hat das mit der Angabe der Serverdaten im Code nicht funktioniert? Beides zusammen ist offensichtlich nicht nötig, da es nun auch mit dem Erzeugen eines "leeren" InitialContext funktioniert.
InitialContext jndiContext = new InitialContext();
 
derHarri hat gesagt.:
SUPER das hat geklappt. Danke für deine Hilfe!

Kannst du mir jetzt vielleicht sogar noch erklären wieso das so ging?
Die jbossall-client.jar hatte ich davor schon im Classpath, ich habe nur noch die jndi.properties ergänzt und siehe da.. wunderbar. Ich vermute mal, dass die Anwendung nun die Daten aus der Propertiesdatei ließt. Wieso hat das mit der Angabe der Serverdaten im Code nicht funktioniert? Beides zusammen ist offensichtlich nicht nötig, da es nun auch mit dem Erzeugen eines "leeren" InitialContext funktioniert.
InitialContext jndiContext = new InitialContext();


Deine Lösung funktioniert auch. Nur hast du einen kleinen Fehler gemacht:

"java.naming.factory.initial" ist der richtige Key. Du hast:
"javax.naming.factory.initial" in deinen Properties genutzt.
dito bei:
javax.naming.provider.url

schreib deine lösung um auf:

Java:
String urlName = "jnp://hulk:1099";
Properties p = new Properties();
p.put("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory");
p.put("java.naming.provider.url", urlName);           
p.put("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
InitialContext jndiContext = new InitialContext(p);

Dann klappt das auch bei dir ;-)
 

Neue Beiträge

Zurück