PR

5週にわたって次世代Java Plug-inのJNP APIサポートについて解説してきましたが,今週がその最終回です。今週取りあげるのは,SingleInstanceServiceとDownloadServiceの2つのサービスです。

SingleInstanceService

SingleInstanceServiceはアプレットの起動を制限するために使用します。いうなれば,アプレットをシングルトン化するためのサービスです。

javax.jnlp.SingleInstanceServiceインタフェースを使用するには,javax.jnlp.SingleInstanceListenerインタフェースと一緒に使用します。

アプレットはSingleInstanceServiceオブジェクトにSingleInstanceListnerオブジェクトをリスナ登録した時点から,アプレットが起動することを制限します。

SingleInstanceListenerインタフェースのnewActivationメソッドは,アプレットが起動しようとする時にコールされます。newActivationメソッドの引数は文字列の配列です。実際にはJNLPファイルの内容がそのまま引き渡されるようです。

では,実際にサンプルを通して,使い方を見ていきましょう。

サンプルのソース(こちらからダウンロードできます)
・SingleInstanceSample.java
・singleinstancesample.jnlp

このサンプルアプレットでは,アプレットを起動した後に再びアプレットを起動しようとすると,ダイアログを表示してアプレットがすでに起動していることを示します。

では,まずinitメソッドを次に示します。

    @Override
    public void init() {
        try {
            // サービスの取得
            service 
                = (SingleInstanceService)ServiceManager.lookup(
                            "javax.jnlp.SingleInstanceService");
        } catch (UnavailableServiceException ex) {
            add(new JLabel("サービスが使用できません"));
            return;
        }

        add(new JLabel("SingleInstanceService Sample"));

        listener = new SingleInstanceListener() {
            public void newActivation(String[] params) {
                showErrorMessage(
                    "すでにアプレットが実行しています");
            }
        };

        // リスナを登録し,アプレットをシングルトンにする
        service.addSingleInstanceListener(listener);
    }
 
    private void showErrorMessage(String message) {
        JOptionPane.showMessageDialog(this,
                                      message,
                                      "Error",
                                      JOptionPane.ERROR_MESSAGE);
    }

SingleInstanceServiceオブジェクトの生成は,今まで解説してきたサービスと同様にjavax.jnlp.ServiceManagerクラスのlookupメソッドを使用します(オレンジ色部分)。

次にSingleInstanceListenerインタフェースを実装した無名クラスを定義し,オブジェクトを生成します。青字で示したnewActivationメソッドではダイアログに指定した文字列を表示するメソッドをコールしています。

最後に赤字で示したように,SingleInstanceServiceオブジェクトのaddSingleInstanceListenerメソッドを,先に生成したSingleInstanceListenerオブジェクトを引数にしてコールします。

この時点でアプレットはシングルトン化され,このアプレットが起動させられるとnewActivationメソッドがコールされます。

シングルトン化されたアプレットは最終的にはシングルトンの解除を行います。ここでは,アプレットが終了する時点でアプレットの解除を行いました。

    @Override
    public void stop() {
        // アプレットの終了時に,リスナを削除する
        service.removeSingleInstanceListener(listener);
    }

シングルトンの解除は,SingleInstanceServiceインタフェースのremoveSingleInstanceListenerメソッドをコールします。