2016-09-30 3 views

答えて

1

RMIサーバーがクラッシュした場合、/ RMIサーバーが登録されているJava RMIレジストリから削除されたこのサーバーの名前は?

レジストリはそのことを知らされず、チェックもしません。

1

は、問題を示していますシンプルかつ堅牢な例である:

public class RMITEst { 
    static class Registry { 
     public static void main(String[] args) throws RemoteException, InterruptedException { 
      java.rmi.registry.Registry registry = LocateRegistry.createRegistry(1099); 
      Thread.sleep(Long.MAX_VALUE); 
     } 
    } 

    static class Server { 
     public static void main(String[] args) throws RemoteException { 
      java.rmi.registry.Registry registry = LocateRegistry.getRegistry(); 
      TestService service = new TestServiceImpl(); 
      Remote stub = UnicastRemoteObject.exportObject(service, 0); 

      registry.rebind("test", stub); 

     } 

    } 

    static class Client { 
     public static void main(String[] args) throws AccessException, RemoteException, NotBoundException { 
      System.out.println(Arrays.asList(LocateRegistry.getRegistry().list())); 
      TestService stub = (TestService) LocateRegistry.getRegistry().lookup("test"); 
      stub.test(); 
     } 
    } 

} 

interface TestService extends Remote { 
    public void test() throws RemoteException; 
} 

class TestServiceImpl implements TestService { 

    @Override 
    public void test() { 
     System.out.println("I am alive!"); 
    } 

} 

それを使用する方法(すべては、Eclipseから行うことができます):

  1. 実行レジストリ
  2. ランクライアント - オブジェクトがバインドされていないために例外が発生します(レジストリは機能しています)
  3. 実行サーバー
  4. 実行クライアント - リモートメソッドinvokactionは動作しますtestは検索リストにあります
  5. キルサーバ
  6. 実行クライアント - testはまだルックアップリストにあります! - 接続が拒否された例外はスローされます。

したがって、RMIレジストリは、リモートオブジェクトが消滅しても自動的にバインドをアンバインドしません。 JVMのクラッシュが原因です。

+0

オブジェクト*は、アンエクスポートされているだけでなく、サーバーJVMが終了すると完全に破棄されます。したがって接続の拒否。何も起きていないのは、レジストリからバインド解除されているため、ルックアップがまだ機能している理由です。同じことではありません。 – EJP

+0

@EJPあなたは正しいです、私は正しいと思っていましたが、間違った用語を使用しました。 – Antoniossss

関連する問題