タツノオトシゴのブログ

主にJavaに関するものです。

RMIサーバを正常に停止する

  • 参考

http://stackoverflow.com/questions/241034/how-to-remotely-shutdown-a-java-rmi-server

  • RMIサーバを停止する場合は、JavaのプロセスをKillすればよいが、そうするとJVM HotSpotのエラーが出力されたりして、異常停止などした場合など障害切り分けが面倒になる。
  • 正常に停止するには、サーバ自身に停止させる必要がある。
    • RMIで呼び出すメソッドにJVM停止用のメソッドを用意しておき、その中で、System.exit(0)を呼ぶようにする。そのメソッドをRMIクライアントから呼び出す。
    • 実際には、単に停止するだけだと、突然コネクションが切れてクライアント側で例外がスローされてしまうため、Threadで非同期に停止する。
  • Threadで非同期にすることで、クライアント側では正常にメソッドが実行されたと認識され、Threadでwaitした数秒後に、exitでJVMを終了する。
    // 停止用メソッド
    @Override
    public void terminate() {
        
        // 別スレッドで非同期で停止する。
        new Thread() {
            @Override
            public void run() {
                System.out.print("shutting down rmi");
                try {
                    for(int i=0; i < 5; i++) {
                        System.out.print(".");
                        sleep(1000);
                    }
                } catch(InterruptedException e) {}
                
                System.out.println("done.");
                Runtime.getRuntime().exit(0);
            }
        }.start();
    }