概要: wrapper.single_invocation.notify プロパティ

単一起動が有効になっている場合、Wrapper は他に [ wrapper.ntservice.name ] プロパティと同じ値で実行されているインスタンスがあるかどうかをチェックします。他に起動されているインスタンスが存在するとデフォルトでエラーメッセージが表示されます。

バージョン 3.5.28 より、エラーメッセージを表示せず、実行中のアプリケーションのウィンドウに焦点をあてることが可能です。追加コーディングが不要で、すぐに実行するこが出来ます。

別の解決策は第二起動の応対でカスタムアクションの実行を可能にします。複数のアプリケーションウィンドウがある場合、表示させるウィンドウを設定できます。カスタムメッセージの表示やメール通知などの別のアクションをトリガーできます。この解決策はイベント処理をもとにしているため、いくつかのコーディングが必要とします。

注意

これらの新機能は、Wrapperの第二インスタンスを第一インスタンスと同じユーザー(もしくは、それより高い権限のあるユーザー)で実行する必要があります。

もし、第一インスタンスがサービスとして実行されていると、インタラクティブでない限り、GUIを表示することが出来ません。ウィンドウに焦点をあてることが出来ませんが、権限のある第二インスタンスはGUIと関わらない限り、別のアクションをトリガーできます。

Windows VistaとServer 2008以降、サービスはユーザーデスクトップと対話できなくなっています。その場合、サービスはデスクトップアプリケーションに焦点をあてることが出来ません。

wrapper.single_invocation.notify

対応バージョン :3.5.28
対応エディション :プロフェッショナル版スタンダード版コミュニティー版 (未対応)
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)

TRUEに設定されている場合、このプロパティは実行中のアプリケーションを監視するWrapperに他のインスタンスを実行しようとすると警告をします。 デフォルトでJavaアプリケーションの最初の可視ウィンドウ(Z オーダー)に焦点をあてます。ただし、wrapper.single_invocation.notify.focus_windowを使えばこの機能を無効にするが出来ます。

Wrapperは'WrapperSecondInvocationEvent'と呼ばれるイベントをトリガーされるJVMに通知を送信します。 このイベントは、Javaアプリケーションによりカスタムタスクを実行することができます。 このプロパティのデフォルト値はFALSEで、通知が送信されず、インスタンスがすでに実行されている場合、シンプルなエラーメッセージが表示されます。

イベントを処理するには、アプリケーションでいくつかの変更が必要です。

  • まず、wrapper.jar.に依存関係を追加します。
  • 次にクラスのいずれかにインタフェースorg.tanukisoftware.wrapper.event.WrapperEventListenerを登録します。 こちらはクラスに一つだけのメソッドを追加することが必要です。イベントがトリガーされた時にこのメソッドを呼び出します。
  • 最後に、クラスをイベントのリスナーとして追加します。
例:WrapperEventListener登録とWrapperSecondInvocationEventの実行方法
import org.tanukisoftware.wrapper.WrapperManager;
import org.tanukisoftware.wrapper.event.WrapperEvent;
import org.tanukisoftware.wrapper.event.WrapperSecondInvocationEvent;
import org.tanukisoftware.wrapper.event.WrapperEventListener;

// Implement WrapperEventListener
public class Main implements WrapperEventListener {
    
    /**
    * アプリケーションを作成します。
    */
    public Main() {
        ...
        // WrapperSecondInvocationEvent のリスナーに追加します。
        WrapperManager.addWrapperEventListener( this, 
            WrapperEventListener.EVENT_FLAG_REMOTE_CONTROL );
    }
        
    public void fired( WrapperEvent event ) {
        if (event instanceof WrapperSecondInvocationEvent ) {
            // ここに WrapperSecondInvocationEvent に反応する、 
            // 実行するコードを入力します。
            ...
        }
    }
}

カスタムアクションは fired() method 内にコーディングできます。 通常はユーザーが実行中のアプリケーションを再度実行しようとすると、そのアプリケーションの指定のウィンドウを前に表示させるることです。 次の例は setAlwaysOnTop(true) でウィンドウを前に表示させます。 ただし、そのウィンドウは常に一番前に表示されますので、ユーザーは別のウィンドウにクリックしても、こちらはずっと一番前に表示されます。 無効にするには setAlwaysOnTop(false)に設定してください。

例:
public void fired( WrapperEvent event )
{
    if (event instanceof WrapperSecondInvocationEvent )
    {
        // java 1.5 以降が必要
        frame.setAlwaysOnTop(true); // ウィンドウを最前面にもってきます
        frame.setAlwaysOnTop(false);  // 最前面フィーチャーを解除します。
    }
}

警告

こちらのプロパティを有効にすることで、二つの Wrapper インスタンス間の通信を可能にするため、指定のパイプが開かれます。 同じユーザー、もしくはそれより権限の高いユーザーが実行している全てのアプリケーションがパイプ経由で通信ができ、イベントをトリガーすることができるので、ご注意ください。 これはセキュリティ上の問題を起こす可能性があり、Java アプリケーションがこの点に関して安全なコードを実行しなければなりません。

wrapper.single_invocation.notify.focus_window

対応バージョン :3.5.28
対応エディション :プロフェッショナル版スタンダード版コミュニティー版 (未対応)
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)

このプロパティはデフォルトでTRUEに設定され、ユーザーはそれをもう一度起動しようとするたびJavaアプリケーションの最初の可視ウィンドウ(Z オーダー)を焦点をさせるようにあります。 そのようなウィンドウがない場合、実行中のアプリケーションを監視する Wrapper のウィンドウに焦点をさせます。この機能はwrapper.single_invocation.notifyがTRUEに設定されている場合のみ使用可能です。

技術的に、Javaアプリケーションはユーザーが二つ目のインスタンスを実行しようとする時にアクティブなアプリケーションではないため、単独のウィンドウをアクティブにすることは出来ません。 Javaアプリケーションを監視するWrapperが別のインスタンスからの通知を受信すると、ユーザーが実行したインスタンスを適切なウィンドウが有効にされるために必要な情報を通信します。 いずれの場合においても、これは、JavaアプリケーションをZ オーダーの最上位に希望のウィンドウを表示させるイベントトリガーが実行された後に行われます。

焦点が背面にあるウィンドウの場合、ウィンドウを前面に持ってくるのが混乱する可能性があるので、ウィンドウを含まないカスタムアクションを実行した場合を除き、このプロパティを常にTRUEに設定した方をお勧めします。

wrapper.single_invocation.notify.timeout

対応バージョン :3.5.28
対応エディション :プロフェッショナル版スタンダード版コミュニティー版 (未対応)
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)

このプロパティは、実行中のインスタンスからの応答を取得するまでにWrapperが待機する時間(秒)の最大量を指定します。その秒数内に確認できない場合、エラーメッセージを表示し、停止します。 デフォルト値は15秒に設定されています。イベントによってトリガアクションが実行に時間がかかりすぎる場合を除き、応答は待ち時間なしで取得できるはずです。

wrapper.single_invocation.notify.show_splashscreen

対応バージョン :3.5.28
対応エディション :プロフェッショナル版スタンダード版コミュニティー版 (未対応)
対応プラットフォーム :WindowsMac OSX (未対応)Linux (未対応)IBM AIX (未対応)FreeBSD (未対応)HP-UX (未対応)Solaris (未対応)IBM z/Linux (未対応)

単一起動モードでは、デフォルト動作は第二起動の際に、スプラッシュ画面を表示しません。イベントよりトリガーされたアクションは実行に時間をかかりすぎる場合、スプラッシュスクリーンを表示した方が効果的です。プロパティをTRUEに設定すると実行できます。

参照: 単一起動