Avatar billede conrad Nybegynder
10. januar 2003 - 15:54 Der er 32 kommentarer og
2 løsninger

Kalde metode på EJB

Jeg har lavet en bean , pakket den i en jar sammen med META-INF og deployet den på JBOSS. Det ser ud til at virke.

Nu forsøger jeg så at få forbindelse til beanen fra et simpelt klient program og kalde en metode. Klient programmet følger her:
//package org.jboss.docs.interest;

import mybean.*;

import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

class MyBeanClient
{
  public static void main(String[] args)
  {
      try
      {
        // Get a naming context
        InitialContext jndiContext = new InitialContext();
        System.out.println("Got context");
       
        // Get a reference to the Interest Bean
        Object ref  = jndiContext.lookup("mybean/MyBean");
        Object ref  = jndiContext.lookup("mybean/MyBean");
        System.out.println("Got reference");
       
        // Get a reference from this to the Bean's Home interface
        MyBeanHome home = (MyBeanHome) PortableRemoteObject.narrow(ref, MyBeanHome.class);
       
        // Create an Interest object from the Home interface
        MyBean mb = home.create();
       
        // call the bean method
        System.out.println("Calling method on mybean");
        System.out.println(mb.myBeanMethod(100));
      }
      catch(Exception e)
      {
        System.out.println(e.toString());
      }
  }
}

Min jboss.xml ser således ud:

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
  <enterprise-beans>
    <session>
      <ejb-name>MyBean</ejb-name>
      <jndi-name>mybean/MyBean</jndi-name>
    </session>
  </enterprise-beans>
</jboss>

Når jeg kører klienten (fra DOS prompt) får jeg følgende exception:
javax.naming.CommunicationException: Can't find SerialContextProvider

spørgsmål 1: Jeg følger en tutorial fra http://www.jboss.org/online-manual/HTML/ som selvfølgelig er nede :(, derfor: kan det jeg prøver overhovedet lade sig gøre?

spørgsmål 2: hvis det kan lade sig gøre, hvad gør jeg så forkert?

(ps: ved godt at det her minder meget om http://www.eksperten.dk/spm/288933)
Avatar billede dsj Nybegynder
10. januar 2003 - 16:03 #1
hvad hedder den jar-fil du har deployet?
Avatar billede dsj Nybegynder
10. januar 2003 - 16:07 #2
hmm, det med jarfilen var noget andet jeg tænkte på.

I hvert fald skulle det kunne lade sig gøre, hvis du kalder EJB'en med dens klassenavn:

InitialContext ic = new InitialContext();
Object objRef = ic.lookup("MinBean");

...hvis EJB'en hedder MinBean.class
Avatar billede conrad Nybegynder
10. januar 2003 - 16:16 #3
Har lige prøvet at rette: 
Object ref  = jndiContext.lookup("mybean/MyBean"); til
Object ref  = jndiContext.lookup("MyBean");

Det gir stadig samme fejl?
Avatar billede conrad Nybegynder
10. januar 2003 - 16:20 #4
Descriptor filen ser således ud:
<?xml version="1.0" encoding="UTF-8"?>

<ejb-jar>
    <description>My first bean example</description>
    <display-name>MyBean example</display-name>
    <enterprise-beans>
      <session>
        <ejb-name>MyBean</ejb-name>
        <home>mybean.MyBeanHome</home>
        <remote>mybean.MyBean</remote>
        <ejb-class>mybean.MyBeanBean</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Bean</transaction-type>
      </session>
    </enterprise-beans>
</ejb-jar>

Kan det være her der er noget galt?
Avatar billede dsj Nybegynder
10. januar 2003 - 16:30 #5
Prøv at deploye klienten sammen med din EJB i en ear-fil
Avatar billede conrad Nybegynder
10. januar 2003 - 16:34 #6
ear file? (jeg er helt ny i det her j2ee)
Har du et link til hvordan man laver sådan en?
Avatar billede dsj Nybegynder
10. januar 2003 - 17:03 #7
en ear-fil er blot en jar-fil, hvor du omdøber efternavnet til .ear
Avatar billede conrad Nybegynder
10. januar 2003 - 17:07 #8
Vil det sige at jeg skal pakke de 3 bean klasser (2 interface + 1 klasse), klienten + META-INF i en jar og derefter lave den om til en ear file?

Hvorfra skal jeg så starte klienten?
Avatar billede conrad Nybegynder
10. januar 2003 - 17:18 #9
Har lige prøvet at pakke klient sammen med bean og META-INF til .jar fil og dernæst til .ear fil. Dette gav følgende exception fra JBOSS ved deployment:

org.jboss.deployment.DeploymentException: No META-INF/application.xml found

Er der ikke en kan fortælle hvorledes alle disse filer skal pakkes?
Avatar billede dsj Nybegynder
10. januar 2003 - 22:03 #10
Du bliver nok nødt til at tage et kig forbi http://java.sun.com/j2ee/tutorial/1_3-fcs/doc/EJBConcepts.html

Jeg er ikke vant til at bruge EJB'er fra en klient, men derimod fra jsp-sider. Jeg ved kun hvordan man anvender klienten, i forbindelse med EJB'er, når SUN's J2EE-server og deploy-tool anvendes. Jeg kan nok ikke helt hjælpe dig.

Anvender man jsp-sider, pakkes disse på samme måde som EJB'erne i en .war-fil (egentlig bare en .jar) med et META-INF-bibliotek ligesom EJB'erne og en tilhørende descriptor. jar-filen med EJB'er og war-filen med jsp-sider pakkes og lægges i en ear-fil. Denne ear-fil deployes så i JBoss, hvorefter jeg ved det virker, men det sker ikke på samme måde med en klient kan jeg se...
Avatar billede conrad Nybegynder
10. januar 2003 - 22:21 #11
ok, jeg prøver at lave klienten om til en JSP side imorgen.
Avatar billede dsj Nybegynder
10. januar 2003 - 22:22 #12
Jeg tror også det er nemmere for dig, jeg havde i hvert fald mest besvær med at få klienten til at virke...
Avatar billede arne_v Ekspert
11. januar 2003 - 10:48 #13
En .ear fil er *IKKE* en omdøbt EJB .jar fil !

En .ear fil er en fil (i jar format) som indeholder
et antal .war filer og et antal EJB .jar filer (og et
antal .rar filer men det bruges sjældent).
Avatar billede arne_v Ekspert
11. januar 2003 - 10:48 #14
Så hold dig (indtil videre til din EJB .jar fil).
Avatar billede arne_v Ekspert
11. januar 2003 - 10:50 #15
Der er 3 ting du skal have på plads:
1) have de rigtige class-filer i client programmets classpath
2) sætte de rigtige properties for JNDI lookup
3) bruge det rigtige JNDI navn
Avatar billede arne_v Ekspert
11. januar 2003 - 10:52 #16
re 1)

jboss-client.jar
Avatar billede arne_v Ekspert
11. januar 2003 - 10:52 #17
re 2)

        System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        System.setProperty("java.naming.factory.url.pkgs", "org.jnp.interfaces");
        System.setProperty("java.naming.provider.url", "localhost:1099");
Avatar billede arne_v Ekspert
11. januar 2003 - 10:55 #18
re 3)

der er et default JNDI navn, men jeg foretrækker altid at sætte det explicit !

Hvis du sammen med din ejb-jar.xml ligger en jboss.xml med:

<?xml version="1.0"?>
<jboss>
    <enterprise-beans>
        <session>
            <ejb-name>navn på EJB i ejb-jar.xml</ejb-name>
            <jndi-name>det navn jeg vil slå op</jndi-name>
        </session>
    </enterprise-beans>
</jboss>

så virker det.

(og du skal alligevel bruge jboss.xml når du skal i gang med CMP !
Avatar billede arne_v Ekspert
11. januar 2003 - 10:59 #19
Så du beholde din oprindelige jboss.xml, slår op med mybean/MyBean
som oprindeligt.

Fejlen ligger enten i manglende properties eller manglende
classpath.
Avatar billede conrad Nybegynder
11. januar 2003 - 14:23 #20
arne: hvor skal følgende sættes? i klient programmet?

)

        System.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
        System.setProperty("java.naming.factory.url.pkgs", "org.jnp.interfaces");
        System.setProperty("java.naming.provider.url", "localhost:1099");
Avatar billede conrad Nybegynder
11. januar 2003 - 14:54 #21
Jeg har lige prøvet at lave en jsp side og deploye den som .war. Fra den kan jeg godt få fat på beanen.

arne_v jeg kunne nu godt tænke mig at få det med klienten til at virke. Jeg prøvede at sætte "properties linierne" re 2) ind i klienten. Det gav følgende fejl:
javax.naming.NoInitialContextException: Cannot instantiate class: org.jnp.interf
aces.NamingContextFactory [Root exception is java.lang.ClassNotFoundException: o
rg.jnp.interfaces.NamingContextFactory]

Kunne måske tyde på noget ikke er sat ordentligt op?
Avatar billede arne_v Ekspert
11. januar 2003 - 15:15 #22
De 3 linier skal sættes ind et eller andet sted i client.

(du kan også sætte dem op med -D på kommandoe-linien)
Avatar billede arne_v Ekspert
11. januar 2003 - 15:17 #23
Med hensyn til fejlen:

ClassNotFoundException: org.jnp.interfaces.NamingContextFactory]

så prøv og put jnp-client i client classpath (jeg formoder, at
du allerede gar jboss-client i client classpath !!!!).
Avatar billede arne_v Ekspert
11. januar 2003 - 15:18 #24
Det er "normalt" at ens EJB'er kaldes fra JSP/servlet i
et "production environment".

Men for test er det altså nemmest at teste dem standalone via en
test client.

Når man kalder dem fra JSP/servlet så undgår man (i JBoss+Tomcat)
en del problemer m.h.t. classpath, fordi alt kører i samme
JVM.
Avatar billede conrad Nybegynder
11. januar 2003 - 15:36 #25
Har lige prøvet at tilføje den ekstra fil til CLASSPATH (jo jboss-client er der også). Nu får jeg flg Execption:

Exception in thread "main" java.lang.NoClassDefFoundError: org/jboss/logging/Log
ger
        at org.jnp.interfaces.NamingContext.<clinit>(NamingContext.java:92)
        at org.jnp.interfaces.NamingContextFactory.getInitialContext(NamingConte
xtFactory.java:42)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:6
62)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243
)
        at javax.naming.InitialContext.init(InitialContext.java:219)
        at javax.naming.InitialContext.<init>(InitialContext.java:175)
        at MyBeanClient.main(MyBeanClient.java:25)
Avatar billede arne_v Ekspert
11. januar 2003 - 15:39 #26
Hmm.

Skruen uden ende.

Der mangler endnu en jar-fil.

Kan du ike prøve med jbossall-client.jar !

(hvis navnet passer, så skulle den jo have *alt*)
Avatar billede conrad Nybegynder
11. januar 2003 - 15:43 #27
Det gav så :
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Prio
rity
        at org.jnp.interfaces.NamingContext.<clinit>(NamingContext.java:92)
        at org.jnp.interfaces.NamingContextFactory.getInitialContext(NamingConte
xtFactory.java:42)
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:6
62)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:243
)
        at javax.naming.InitialContext.init(InitialContext.java:219)
        at javax.naming.InitialContext.<init>(InitialContext.java:175)
        at MyBeanClient.main(MyBeanClient.java:25)

Det virker lidt "mærkeligt" alle disse jars skal i klientens classpath gør det ikke?
Avatar billede conrad Nybegynder
11. januar 2003 - 15:47 #28
inkluderede også log4j.jar i CLASSPATH og det virker nu!! Fedt!
Mange tak for hjælpen begge to!
Avatar billede arne_v Ekspert
11. januar 2003 - 15:50 #29
Iøvrigt, hvis du ikke allerede bruger log4j, så begynd på det !
Avatar billede conrad Nybegynder
11. januar 2003 - 15:54 #30
log4j ? Hvad er det?
Avatar billede arne_v Ekspert
11. januar 2003 - 16:03 #31
Log4j er et logging framework fra Apache.

http://jakarta.apache.org/log4j/docs/index.html

Det bruges af så godt som alle Java server applikationer.
Avatar billede arne_v Ekspert
11. januar 2003 - 16:04 #32
JBoss bruger det selv.

Kort fortalt går det hele ud på, at man sætter
log statements ind mange steder i sin kode og så
bestemmer man, hvor meget der rent faktisk skal
logges og hvor der skal logges i en konfigurations
fil.
Avatar billede arne_v Ekspert
11. januar 2003 - 16:08 #33
Man kan selvfølgelig også bruge log4j i client applikationer men:

1)  System.out.println ender normalt et fornuftigt sted
    i modsætning til server applikationer.

2)  Client applikationer er normalt mindre end server
    applikationer, så derfor er der ikke de samme behov
    for at kunne styre hvad der logges.

3)  Hvis en client applikation får en fatal fejl, så lukker
    den bare ned. En server applikation skal helst logge
    fejlen men køre videre og processe requests fra
    andre clients.

Så lad os sige at 3 ud af 4 server applikationer bruger log4j,
så er det måske kun 1 ud af 25 client applikationer.
Avatar billede conrad Nybegynder
11. januar 2003 - 17:12 #34
Tak for forklaringen! Så lærte man også noget nyt idag
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB