Newsgroup: it.comp.java
Titolo: Client chiama EJB. EJB non Risponde!

Salve a tutti.
Ho appena scritto il mio primo EJB, tutto sembra funzionare se sia l'ejb 
che il client sono sulla stessa macchina.
Il mio Application Server è JOnAS.
Faccio il deploying dell'ejb.
Lancio il client tramite:
jclient -cp C:\TESI\JOnAS-3.2\ejbjars\MatteoEjbModule.jar 
BeanNameEnterprise1TestClient1
Il mio client è più o meno fatto cosi':
...
Object ref = context.lookup("JNDINameEnterprise1");
//look up jndi name and cast to Home interface
enterprise1Home = (Enterprise1Home) PortableRemoteObject.narrow(ref, 
Enterprise1Home.class);
...
ent1 = enterprise1Home.create();
System.out.println(ent1.pippo());  <-- pippo e'il metodo dell'ejb
// fine client
Ora:
- Se il client volesse chiamare un ejb che sta deployato su un'altra 
macchina come devo fare?
E'possibile specificare direttamente nel codice del client l'indirizzo 
ip della macchina su cui chiamo l'ejb?
Grazie mille per le risposte!
(praticamente alla fine della storia cosa voglio ottenere:
Ho una serie di ApplicationServer in LAN (ancora non so se metterli in 
clustering/replication)...
Ogni AS ha un lista con gli ip degli altri.
Ogni AS deve controllare che tutti gli altri AS siano UP (o chi è caduto).
Per fare questo ho pensato di usare un ejb.
Il client dovra'quindi essere integrato dentro il codice dell'AS (ho 
gia'scritto un servizio aggiuntivo per jonas)...
questo codice in jonas, richiamera'l'ejb sugli ip della lista.
Chi non gli risponde, vuol dire che è caduto.
Secondo voi è fantascienza?)
Grazie e ciao

 ha scritto nel messaggio
news:uXZcb.7932$Zh....@tornado.fastwebnet.it...


 
Grazie per aver risposto!
Allora,
se ho il mio ejb sul PC1 ed il client sullo stesso PC, tutto funziona.
allora ho provato a modificare il client nel seguente modo:
.
.
Hashtable env = new Hashtable();
env.put(Context.PROVIDER_URL, "37.6.129.131");
Context context = new InitialContext(env);
Object ref = context.lookup("JNDINameEnterprise1");
enterprise1Home = (Enterprise1Home) PortableRemoteObject.narrow(ref, 
Enterprise1Home.class);
Enterprise1 ent1 = null;
ent1 = enterprise1Home.create();
System.out.println(ent1.pippo());
.
.
pippo e'il metodo del mio ejb.
ho lasciato tutto il jar anche in locale visto che immagino non serva 
lasciarci solo la home e la remote interface... (visto che poi un altro 
client dovra'richiamare l'ejb che sta qua, sul PC1)
Ma il client richiama sempre l'ejb che sta in locale, cioe'sul PC1.
Infatti arrestando il server jonas sul PC2, l'esecuzione del client sul 
PC1 va a buon fine...quindi l'ejb lo richiama in locale....
Cosa devo mettere nel codice per chiamare un ejb su uno specifico server?
ps ma il jndi.properties dove sta? Lo devo creare io?
Forse ho le idee un po'confuse
Grazie per l'aiuto
Matteo

 env.put(Context.PROVIDER_URL, "37.6.129.131");
[cut]
Questo è un po' poco per un env di un InitialContext (che chiaramente farà
fallback in qualche modo se ti funziona la lookup)
Prova a leggere qui (e' l'unico documento su Jonas che ho trovato al volo)
http://jonas.objectweb.org/doc/tutorial/html/sec_configfiles.html
C'è scritto cosa scrivere nel file jndi.properties (che sono esattamente
le stesse coppie di valori che portresti specificare nel Hashtable env che
passi al costruttore di InitialContext. 
A prima vista l'errore più grosso è che non fornendo un Factory di
connessioni al JNDI relativo del tuo application server, ovviamente
l'applicazione (che sarà una servlet?) si collega al JNDI provider che
risiede nella stessa JVM.
 
Ciao
Giuseppe


Ciao,
grazie per la risposta!
Seguendo il link che mi hai indicato, ho capito che devo configurare il 
file carol.properities (precedentemente era jndi.proprerities).
Quindi ho settato:
carol.protocols=jeremie
e nel client:
-------------------
Properties p = new Properties();
// USARE JEREMIE
p.setProperty(Context.INITIAL_CONTEXT_FACTORY,"org.objectweb.jeremie.libs.services.registry.jndi.JRMIInitialContextFactory");
p.setProperty(Context.PROVIDER_URL, "jrmi://
37.6.129.133:2000
");
p.setProperty(Context.URL_PKG_PREFIXES,"org.objectweb.jonas.naming");
InitialContext ctx = new InitialContext(p);
Object obj = ctx.lookup("JNDINameEnterprise1");
enterprise2Home = (Enterprise1Home) PortableRemoteObject.narrow(obj, 
Enterprise1Home.class);
Enterprise1 ent1 = enterprise2Home.create();
System.out.println(ent1.pippo());
-------------------
Ora tutto funziona.
Ho solo un problema:
Ho l'estrema necessità di settare un timeout per il lookup.
Infatti se il server jonas su cui gira l'ejb è caduto, o l'indirizzo non 
esiste è fondamentale che possa accorgermene entro un tempo prestabilito 
(ad esempio 10 secondi).
Esiste qualcosa per specificare questo nelle proprietà che setto nel client?
ps: l'applicazione finale sarà un servizio (una semplice classe, 
gia'scritta) che girerà sotto jonas periodicamente.
Leggendo da un file una lista di IP (Altri server JOnAS), deve 
accorgersi di quale server gli risponde e quale no.
Quindi ora devo far funzionare decentemente il client...poi lo integrerò 
   nel servizio.
Grazie