2012-01-11 3 views
0

クライアントとサーバー間のすべての接続をRMIプロトコルで終了します。rmi clientを安全に閉じるには?

Remote r= Naming.lookup("rmi://192.168.105.38:9121/AccountRMIService"); 
    if(r instanceof RmiInvocationWrapper_Stub) { 
     RmiInvocationWrapper_Stub stub = (RmiInvocationWrapper_Stub)r; 
     System.out.println("hashCode="+stub.getRef().hashCode()); 
    } 
    System.out.println(r); 
    //How to close the connection with 'Remote' ? 

サーバーのRMIの状態を確認するためにいくつかのコードは:

final ThreadLocal<List<Socket>> currentSocket = new ThreadLocal<List<Socket>>() { 

    protected List<Socket> initialValue() { 
     return new ArrayList<Socket>(); 
    } 
}; 
RMISocketFactory.setSocketFactory(new RMISocketFactory() { 

    public Socket createSocket(String host, int port) throws IOException { 
     Socket socket = new Socket(host, port); 
     socket.setKeepAlive(true); 
     socket.setSoTimeout(300); 
     currentSocket.get().add(socket); 
     return socket; 
    } 

    public ServerSocket createServerSocket(int port) throws IOException { 
     return new ServerSocket(port); 
    } 
}); 
Remote r = Naming.lookup("rmi://192.168.105.38:9121/AccountRMIService"); 
if (r instanceof RmiInvocationWrapper_Stub) { 
    RmiInvocationWrapper_Stub stub = (RmiInvocationWrapper_Stub) r; 
    System.out.println("hashCode=" + stub.getRef().hashCode()); 
} 
Iterator<Socket> s = currentSocket.get().iterator(); 
while(s.hasNext()) { 
    s.next().close(); 
    s.remove(); 
} 

これは、RMIのコミュのクライアントではありません。単純なソケットではなく、RMIプロトコルを使ってサーバーの状態を確認したいだけです。 場合によっては、サーバーはまだ実行されていますが、すべての要求がブロックされています。

答えて

-1

UnicastRemoteObject.unexportObject(Remote obj, boolean force)が役に立ちます。

+0

クライアントからのすべての接続を終了するにはどうすればよいですか?サーバーはまだ実行中です。 – imxylz

+0

これはサーバー側のリスニングソケットを除いては何も閉じませんが、将来のすべてのクライアントがリモートメソッド呼び出しを実行できなくなります。頼まれたものではありません。 – EJP

1

基本的なTCPメカニズムの可視性がないため、「すべての接続を閉じる」ことはできません。クライアントでできることは、すべてのRMIスタブをガベージコレクションできることです。基本的な接続はプールされ、とにかくかなり積極的に閉じられます。

関連する問題