2010-03-10 7 views
1

Je suis en train de RMI une assez basique:Java RMI InitialContext: équivalent de LocateRegistry.createRegistry (int)?

// Context namingContext = new InitialContext(); 
     Registry reg = LocateRegistry.createRegistry(9999); 
     for (int i = 0; i < objs.length; i++) { 
      int id = objs[i].getID(); 
//   namingContext.bind("rmi:CustomObj" + id , objs[i]); 
      reg.bind("CustomObj" + id , objs[i]); 
     } 

qui fonctionne sans accroc, mais pour les futurs besoins, je dois utiliser InitialContext.

  Context namingContext = new InitialContext(); 
     for (int i = 0; i < objs.length; i++) { 
      int id = objs[i].getID(); 
      namingContext.bind("rmi:CustomObj" + id , objs[i]); 
     } 

Mais je n'arrive pas à faire fonctionner ça. J'ai commencé rmiregistry à partir de la ligne de commande. Y a-t-il un équivalent de LocateRegistry.createRegistry(int)? Ou un autre moyen de démarrer le registre/registre RMI utilisé par InitialContext depuis l'intérieur de ma classe? (Au lieu de la ligne de commande)


Trace de la pile:

javax.naming.CommunicationException [Root exception is java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
     java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student] 
     at com.sun.jndi.rmi.registry.RegistryContext.bind(RegistryContext.java:126) 
     at com.sun.jndi.toolkit.url.GenericURLContext.bind(GenericURLContext.java:208) 
     at javax.naming.InitialContext.bind(InitialContext.java:400) 
     at bguiz.scratch.RMITest.main(RMITest.java:29) 
Caused by: java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
     java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
     java.lang.ClassNotFoundException: bguiz.scratch.CustomObj 
     at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:396) 
     at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:250) 
     ....(truncated) 

EDIT: Je vais supprimer ma propre question dans quelques jours, car il semble y avoir aucune réponse à cette (Je n'ai pas été capable de le comprendre moi-même). Dernier appel pour tous les biters!

Répondre

1

Après beaucoup de bricolage, j'ai résolu le problème. Pour info, voici ce que c'était:

Le ClassNotFoundException est levé car le registre RMI a son propre chemin de classe. Peu importe que la classe contenant le InitialContext ait les objets personnalisés sur son chemin de classe - Le registre RMI doit être initialisé de sorte que les objets personnalisés soient sur son chemin de classe ainsi que. Pour ce faire, définissez la valeur de l'environnement classpath sur la ligne de communication avant de commencer rmiregistry. Si ce classpath contient la classe de l'objet personnalisé, le ClassNotFoundException n'est pas levé et par la suite ServerException et `CommunicationException 'sont évités.

0

Existe-t-il un équivalent LocateRegistry.createRegistry(int)?

n °

Ou une autre façon de démarrer le registre RMI/registre utilisé par InitialContext à l'intérieur de ma classe?

Seulement LocateRegistry.createRegistry().

Je suis presque sûr que vous devez spécifier le nom d'hôte dans l'URL. Quel message d'erreur exception & recevez-vous?

+0

@EJP J'ai ajouté la trace de la pile à ma question. En outre, cette classe fonctionnera sur le serveur - donc pas besoin de spécifier l'URL (ce sera l'hôte local). Le client a besoin de spécifier l'URL, et puisque je suis en sandbox dans la même machine, il spécifie '' rmi: // localhost: 1099/"', mais je n'ai pas encore atteint ce niveau, car cette classe ne fonctionne pas . – bguiz

0
java.lang.ClassNotFoundException: bguiz.scratch.network.eg.Student caused by 
java.lang.ClassNotFoundException: bguiz.scratch.CustomObj 

Vérifiez si cette classe est disponible?

+0

Oui, c'est très certainement - c'est l'une des premières choses que j'ai vérifié. En fait, le tableau 'objs []' est un tableau de 'CustomObj', qui est utilisé par la même classe. J'ai également vérifié que c'est sur le classpath. – bguiz