Übersicht: wrapper.single_invocation.notify Eigenschaften

Wenn single invocation aktiviert ist, wird der Wrapper überprüfen, dass es keine andere laufende Instanz mit dem gleichen Wert der wrapper.ntservice.name Eigenschaft gibt. Falls eine andere Instanz existiert, wird es standardmäßig einen Fehler anzeigen.

Beginnend mit der Version 3.5.28 ist es möglich, den Fokus einem Fenster der ausführenden Anwendung zu geben statt eine Fehlermeldung anzuzeigen. Dies funktioniert unmittelbar, ohne dass zusätzlicher Programmieraufwand vonnöten wäre.

Eine andere Lösung bietet mehr Flexibilität, indem sie die Ausführung von maßgeschneiderten Aktionen in Antwort auf einen zweiten Auruf ermöglicht. Wenn Ihre Anwendung mehrere Fenster hat, können Sie dieses aussuchen, welches Sie angezeigt haben möchten. Sie mögen vielleicht auch komplett verschiedene Aktionen ausführen wollen, wie das Anzeigen einer kundenspezifischen Antwort oder das Versenden einer Benachrichtigungsemail. Diese Lösung basiert auf Ereignisbehandlung und erfordert etwas Programmieraufwand.

NOTE

Diese neuen Features erfordern, dass die zweite Instanz des Wrappers vom gleichen User gestartet wurde (oder von einem User mit höheren Privilegien) wie in der ersten Instanz.

Wenn die erste Instanz als ein Dienst gestartet wurde, ist es, außer wenn es interaktiv ist, nicht möglich, eine GUI wiederzugeben. Es ist auf diese Weise nicht möglich, den Fokus einem fenster zu geben, aber eine zweite Instanz mit genügend Benutzerberechtigungen wird dennoch in der Lage sein, verschiedene Aktione auszuführen, so lange diese die GUI nicht miteinbeziehen.

Ab Windows Vista und Server 2008, ist es einem Dienst nicht erlaubt mit dem Desktop des Users zu interagieren. In diesem Fall ist der Dienst nicht in der Lage, einer Desktop-Anwendung den Fokus zu geben.

wrapper.single_invocation.notify

Kompatibel :3.5.28
Editionen :Professional EditionStandard EditionCommunity Edition (Not Supported)
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/OS (Not Supported)IBM z/Linux (Not Supported)

Wenn auf TRUE eingestellt, spezifiziert diese Eigenschaft, dass bezüglich des Überwachens der laufenden Anwendung der Wrapper bei jedem Versuch, eine andere Instanz zu starten, benachrichtigt wird. Standardmäßig gibt dies dem ersten sichtbaren Fenster (in der z-Reihenfolge) der Java-Anwendung den Fokus. Jedoch kann dieses Feature durch Nutzung von wrapper.single_invocation.notify.focus_window deaktiviert werden.

Der Wrapper sendet auch der JVM eine Benachrichtigung, die abwechselnd ein Ereignis, 'WrapperSecondInvocationEvent' genannt, auslöst. Dieses Ereignis kann von Ihrer Java-Anwendung genutzt werden, um maßgeschneiderte Aktionen auszuführen. Der Standardwert für diese Eigenschaft ist FALSE, was bedeutet, dass keine Benachrichtigung versendet wird und eine einfache Fehlermeldung angezeigt wird, wenn eine Instanz bereits läuft.

Um mit diesem Ereignis umzugehen, braucht es ein paar Abänderungen in Ihrer Anwendung:

  • Zuerst fügen Sie eine Abhängigkeit der wrapper.jar hinzu.
  • Dann implementieren Sie das Interface org.tanukisoftware.wrapper.event.WrapperEventListener in einer Ihrer Klassen. Dies erfordert, nur eine Methode Ihrer Klasse hinzuzufügen. Es ist die Methode, die aufgerufen wird, wenn das Ereignis ausgelöst wird.
  • Fügen Sie schließlich die Klasse als ein Listener dem Ererignis hinzu.
Beispiel: Wie der WrapperEventListener zu implementieren und zur WrapperSecondInvocationEvent
import org.tanukisoftware.wrapper.WrapperManager;
import org.tanukisoftware.wrapper.event.WrapperEvent;
import org.tanukisoftware.wrapper.event.WrapperSecondInvocationEvent;
import org.tanukisoftware.wrapper.event.WrapperEventListener;

// Implementierung des WrapperEventListener
public class Main implements WrapperEventListener {
    
    /**
    * Erstellen Sie die Anwendung.
    */
    public Main() {
        ...
        // Fügt sich selbst als ein Listener für WrapperSecondInvocationEvent
        WrapperManager.addWrapperEventListener( this, 
            WrapperEventListener.EVENT_FLAG_REMOTE_CONTROL ); hinzu
    }
        
    public void fired( WrapperEvent event ) {
        if (event instanceof WrapperSecondInvocationEvent ) {
            // Schreiben Soie hier bitte den Code, der in Antwort auf die WrapperSecondInvocationEvent ausgeführt werden soll
            ...
        }
    }
}

Jede maßgeschneiderte Aktion kann innerhalb der fired() Methode geschrieben werden. Eine gebräuchliche Praxis ist es, ein spezifisches Fenster der laufenden Anwendung oben anzuzzeigen, wann immer der User versucht, es ein zweites Mal zu starten. Das folgende Beispiel nutzt setAlwaysOnTop(true), um ein Fenster nach vorne zu bringen. Dies bewirkt jedoch, dass das Fenster an oberster Stelle gezeigt wird, was bedeutet, dass es alle anderen Fenster des Desktops überdecken wird, sogar im Fall, wenn der User auf dem Hintergrund klicken würde. Dieses Verhalten kann durch Aufrufen von setAlwaysOnTop(false) deaktiviert werden.

Beispiel:
public void fired( WrapperEvent event )
{
    if (event instanceof WrapperSecondInvocationEvent )
    {
        // requires java 1.5 or later
        frame.setAlwaysOnTop(true); // bringt das Fenster zuvorderst
        frame.setAlwaysOnTop(false);  // entfernt das oberste Feature
    }
}

WARNING

Indem Sie diese Eigenschaft aktivieren, wird eine benannte Pipe geöffnet werden, um die Kommunikation zwischen den zwei Wrapper-instanzen zu erlauben. Seien Sie sich bitte bewusst, dass jede Anwendung, die vom gleichen User oder einem User mit höhreren Berechtigungen ausgeführt wird, kann möglicherweise via der Pipe kommunizieren und ist so in der Lage, das Ereignis auszulösen. Dies mag ein Sicherheitsproblem aufwerfen und es liegt in der Verantwortung der Java-Anwendung, Programmcode auszuführen, der diesbezüglich sicher ist.

wrapper.single_invocation.notify.focus_window

Kompatibel :3.5.28
Editionen :Professional EditionStandard EditionCommunity Edition (Not Supported)
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/OS (Not Supported)IBM z/Linux (Not Supported)

Diese Eigenschaft ist standardmäßig TRUE und gibt dem ersten sichtbaren Fenster der Java-Anwendung den Fokus (in der z-Reihenfolge), wann immer der User versucht, diese ein zweites Mal zu starten. Wenn es nicht ein solches Fenster gibt, dann wird versucht dem Fenster des Wrappers, welches die laufende Anwendung überwacht, den Fokus zu geben. Dieses Feature ist nur verfügbar, wenn wrapper.single_invocation.notify auf TRUE festgelegt ist.

Technisch kann die Java-Anwendung nicht ihrer eigenen Fenster aktivieren, weil es zu dem Zeitpunkt, wenn der User versucht, eine zweite Instanz zu starten, nicht die aktive Anwendung ist. Wenn der Wrapper, der die Java-Anwendung überwacht, von einer anderen Instanz eine Benachrichtigung erhält, wird er die angeforderte Information zurückkommunizieren, so dass die vom User gestartete Instanz das geeignete Fenster aktivieren kann. In jedem Fall wird dies nach dem Auslösen des Ereignisses getan werden, so dass der Java-Anwendung die Möglichgkeit gegeben wird, sein bevorzugtes Fenster zuvorderst an die z-Reihenfolgenposition zu setzen.

Außer Sie führen nur ein paar massgeschneiderte Aktionen aus, die andere Fenster nicht betreffen, sollten Sie stets diese Eigenschaft auf TRUE eingestellt lassen, da es verwirrend sein kann, ein Fenster in den Vordergrund zu bringen, während der Fokus sich immer noch auf ein Fenster im Hintergrund befindet .

wrapper.single_invocation.notify.timeout

Kompatibel :3.5.28
Editionen :Professional EditionStandard EditionCommunity Edition (Not Supported)
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/OS (Not Supported)IBM z/Linux (Not Supported)

Diese Eigenschaft spezifiziert die maximale Zeitdauer ( in Sekunden), die der Wrapper warten wird bis er eine Antwort von der laufenden Instanz erhalten wird. Im Fehlerfall zeigt es eine Fehlermeldung an und beendet sich. Der Standardwert ist auf 15 Sekunden festgelegt. Außer wenn die durch das Ereignis ausgelöste Aktionen zu viel Zeit beanspruchen, sollte die Antwort mit keiner Wartezeit kommen.

wrapper.single_invocation.notify.show_splashscreen

Kompatibel :3.5.28
Editionen :Professional EditionStandard EditionCommunity Edition (Not Supported)
Betriebssysteme :WindowsMac OSX (Not Supported)Linux (Not Supported)IBM AIX (Not Supported)FreeBSD (Not Supported)HP-UX (Not Supported)Solaris (Not Supported)IBM z/OS (Not Supported)IBM z/Linux (Not Supported)

In einen einfachen Aufruf-Modus, wird das Standard-Verhalten nicht auf dem Startbildschirm angezeigt, wenn der Wrapper ein zweites Mal gestartet wird. Wenn die durch das Ereignis ausgelösten Aktionen zu viel Zeit für die Ausführung beanspruchen, mag es nützlich sein, den Startbildschirm anzuzeigen. Dies kann durch Setzen dieser Eigenschaft auf TRUE festgelegt werden.

Verweis: single invocation