FAQ

S2RMI

S2RMIのプログラムをサービス化する方法

S2サポーター (2006-04-29 (土) 19:04:37)

Question

S2RMIのドキュメント通りにサーバプログラムを起動しますが、
終了はCtrl+Cです。この終了ができるように(つまりサービスとして)
実装したいと思っています。

これがサーブレットならtomcatなどを使えばよいのでしょうが、
S2RMIではどのように実装すればいいかよくわかりません。

下記ページのようにThreadを使用する方法が一つ分かっていますが、
他に適切な方法はありますか?
http://seasarproject.g.hatena.ne.jp/ueyama/comment?date=20050528

Answer

1.stopメソッドをもつIStoppableインターフェースを作成します。

package examples.service.main;

public interface IStoppable {
    void stop();
}


2.ServerMainクラスはIStoppableを実装します。

public class ServerMain implements IStoppable


3.ServerMainクラスにstopメソッドを実装します。
新しいスレッドを作成してstaticなexitメソッドを呼びます。

public void stop() {
    Thread destroyer = new Thread() {
        public void run() {
            ServerMain.exit();
        }
    };
    destroyer.start();
}


4.ServerMainクラスにexitメソッドを実装します。
コンテナをdestroyしてexitします。

public static void exit() {
    if (container != null) {
        System.out.println("デストロイヤー参上!");
        container.destroy();
        System.exit(0);
    }
}


5.stopを呼び出すクライアントプログラムとdiconファイルを書きます。

public class RemotingStop {
    private static final String PATH="dicon/RemotingStop.dicon";
    public static void main(String[] args) {
        S2Container container = S2ContainerFactory.create(PATH);
        container.init();
        try {
            IStoppable service = (IStoppable)container.getComponent("remotingStopper");
            service.stop();
        } finally {
            container.destroy();
        }
    }
}


(dicon/RemotingStop.diconファイル抜粋)
<component name="remotingStopper" class="examples.service.main.
IStoppable">
    <aspect>remoting</aspect>
</component>


ServerMainを実行し、その後でRemotingStopを実行すれば終了します。


参考投稿
http://ml.seasar.org/archives/seasar-user/2006-February/005074.html
http://ml.seasar.org/archives/seasar-user/2006-February/005088.html


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-05-11 (木) 20:42:10