Bonjour,
débutant avec les EJB j'essaie de faire fonctionner depuis un certain temps un scénario hello world à base de client lourd géré par un ACC: j'ai une entreprise application qui regroupe un module ejb et une application cliente. Le tout est déployé dans glassfish. Mon client réalise un appel distant à mon module via une interface distante et une injection par @EJB.
Je passe ensuite par java web start pour distribuer mon application cliente.
Mon problème :
lorsque je lance mon client sur la machine hôte de glassfish, le client fonctionne correctement et accède bien à mon module "distant"
lorsque je lance mon client sur un autre poste de mon réseau local, le téléchargement se déroule correctement, j'accède à l'écran de validation de l’exécution, je valide et là rien ne se passe. Je peux laisser la machine tourner longtemps sans que rien ne bouge. Le processus javaw correspondant est bien dans mon pool.
lorsque je lance un client sans accès distant au module ejb (cf. plus bas) celui ci fonctionne sur tous les postes
Mon environnement :
- serveur : windows 7 32bits - netbean 7.1 + glassfish 3.1.1 - java 7 u2
- client 1 : windows 7 64bits - java 7 u2
- client 2 : windows XP 32bits - java 7 u2
Mes sources :
L'interface distante
Le module
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 package service; import javax.ejb.Remote; @Remote public interface ServiceBeanRemote { String service1(); String service2(); }
Le client ne fonctionnant pas:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package service; import javax.ejb.Stateless; @Stateless public class ServiceBean implements ServiceBeanRemote { @Override public String service1() { return "service 1"; } @Override public String service2() { return "service 2"; } }
Client qui fonctionne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package entapp2client; // import divers... import javax.ejb.EJB; import service.ServiceBeanRemote; public class Main { @EJB private static ServiceBeanRemote serviceBean; public static void main(String[] args) { JFrame f = new JFrame(); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.add(new JTextField(serviceBean.service1()), BorderLayout.CENTER); f.setSize(400,400); f.setVisible(true); } }
J'ai tenté plusieurs manœuvres sans succès : extinction des par feux du serveur et de la machine cliente. Changement de l'adresse serveur dans le sun-acc.xml. Test sur 2 machines différentes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 public class Main { public static void main(String[] args) { JOptionPane.showMessageDialog(null, "Hi dude !"); } }
Je ne sais pas comment fonctionne l'injection dans le client mais j'ai l'impression que le contexte reste fixé à localhost qu'importe la machine. Je ne vois nulle part une façon de spécifier l'adresse cible du serveur et je ne vois pas comment glassfish peut connaitre l'IP par laquelle le client accède (ex: comment faire si on accède au serveur derrière un NAT ?)
Si quelqu'un avait la solution à ce problème je passerais de meilleurs nuits![]()
Partager