Comment, à distance, de l'arrêt d'un Serveur Java RMI
J'ai une question très simple Java RMI Serveur qui se présente comme suit:
import java.rmi.*;
import java.rmi.server.*;
public class CalculatorImpl extends UnicastRemoteObject implements Calculator {
private String mServerName;
public CalculatorImpl(String serverName) throws RemoteException
{
super();
mServerName = serverName;
}
public int calculate(int op1, int op2) throws RemoteException
{
return op1 + op2;
}
public void exit() throws RemoteException
{
try{
Naming.unbind(mServerName);
System.out.println("CalculatorServer exiting.");
}
catch(Exception e){}
System.exit(1);
}
public static void main(String args[]) throws Exception
{
System.out.println("Initializing CalculatorServer.");
String serverObjName = "rmi://localhost/Calculator";
Calculator calc = new CalculatorImpl(serverObjName);
Naming.rebind(serverObjName, calc);
System.out.println("CalculatorServer running.");
}
}
Lorsque j'appelle la méthode exit, Système.exit(1) lève l'exception suivante:
CalculatorServer exiting.
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception is:
java.io.EOFException
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:203)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:126)
at CalculatorImpl_Stub.exit(Unknown Source)
at CalculatorClient.<init>(CalculatorClient.java:17)
at CalculatorClient.main(CalculatorClient.java:29)
Caused by: java.io.EOFException
at java.io.DataInputStream.readByte(DataInputStream.java:243)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:189)
... 4 more
[2]+ Exit 1 java CalculatorImpl
Ce que je fais mal dans cette méthode?
OriginalL'auteur Clayton | 2008-10-27
Vous devez vous connecter pour publier un commentaire.
Au cas où quelqu'un a un problème similaire, j'ai trouvé la réponse moi-même. Voici ma méthode exit ():
OriginalL'auteur Clayton
En fait tout simplement l'annulation de l'inscription et immédiatement l'appel Système.la sortie n'est pas fermée correctement. Essentiellement, il interrompt la connexion avant d'en informer le client que le message a été achevée. Ce qui fonctionne est de commencer un petit fil qui arrête le système comme:
Le fil est nécessaire pour être en mesure de laisser les choses se produire dans l'avenir tout en encore de retour de la méthode quit.
J'ai eu le même problème et le réglage de la 2ème paramètre de unexportObject n'a pas aidé, mais le Système en cours d'exécution.la sortie dans un Thread n'a de l'aide.
OriginalL'auteur Paul de Vrieze