Présentation : propriétés wrapper.single_invocation.notify

Lorsque l'invocation unique est activée, le Wrapper vérifiera qu'aucune autre instance n'est en cours d'exécution avec la même valeur de la propriété wrapper.ntservice.name. Si une autre instance existe, un message d'erreur s'affichera par défaut.

À partir de la version 3.5.28, il est possible de donner le focus à une fenêtre de l'application en cours d'exécution au lieu d'afficher le message d'erreur. Cela fonctionnera immédiatement, sans aucun code supplémentaire.

Une autre solution offre davantage de flexibilité en vous permettant d'exécuter des actions personnalisées en réponse à la seconde invocation. Si votre application comporte plusieurs fenêtres, vous pourrez sélectionner précisément celle à afficher. Vous pouvez également déclencher des actions complètement différentes, comme l'affichage d'un message personnalisé ou l'envoi d'une notification par e-mail. Cette solution repose sur la gestion d'événements et nécessite un peu de programmation.

NOTE

Ces nouvelles fonctionnalités exigent que la seconde instance du Wrapper soit lancée par le même utilisateur que la première instance (ou par un utilisateur disposant de privilèges plus élevés).

Si la première instance s'exécute en tant que service, sauf si elle est interactive, elle n'est pas en mesure d'afficher une interface graphique. Il n'est donc pas possible de donner le focus à une fenêtre, mais une seconde instance disposant de privilèges suffisants pourra toujours déclencher différentes actions, tant qu'elles n'impliquent pas l'interface graphique.

À partir de Windows Vista et Server 2008, un service n'est pas autorisé à interagir avec le bureau de l'utilisateur. Dans ce cas, le service ne pourra pas donner le focus à une application de bureau.

wrapper.single_invocation.notify

Compatibilité :3.5.28
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community (non prise en charge)
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

Lorsque cette propriété est définie sur TRUE, elle indique que le Wrapper qui surveille l'application en cours d'exécution sera notifié de toute tentative de lancement d'une autre instance. Par défaut, cela donnera le focus à la première fenêtre visible (dans l'ordre z) de l'application Java. Toutefois, cette fonctionnalité peut être désactivée à l'aide de wrapper.single_invocation.notify.focus_window.

Le Wrapper enverra également une notification à la JVM, qui déclenchera à son tour un événement nommé « WrapperSecondInvocationEvent ». Cet événement peut être traité par votre application Java afin d'exécuter des tâches personnalisées. La valeur par défaut de cette propriété est FALSE, ce qui signifie qu'aucune notification ne sera envoyée et qu'un simple message d'erreur s'affichera si une instance est déjà en cours d'exécution.

Pour gérer l'événement, quelques modifications seront nécessaires dans votre application :

  • Tout d'abord, ajoutez une dépendance à wrapper.jar.
  • Ensuite, implémentez l'interface org.tanukisoftware.wrapper.event.WrapperEventListener dans l'une de vos classes. Cela ne nécessite que l'ajout d'une seule méthode dans votre classe. Il s'agit de la méthode qui sera appelée lorsque l'événement est déclenché.
  • Enfin, ajoutez la classe en tant qu'écouteur de l'événement.
Exemple : comment implémenter WrapperEventListener et écouter 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 {
    
    /**
    * Create the application.
    */
    public Main() {
        ...
        // Adds itself as a listener for WrapperSecondInvocationEvent
        WrapperManager.addWrapperEventListener( this, 
            WrapperEventListener.EVENT_FLAG_REMOTE_CONTROL );
    }
        
    public void fired( WrapperEvent event ) {
        if (event instanceof WrapperSecondInvocationEvent ) {
            // Write here the code to be executed 
            // in response to WrapperSecondInvocationEvent
            ...
        }
    }
}

Toute action personnalisée peut être codée dans la méthode fired(). Une pratique courante consiste à ramener une fenêtre spécifique de l'application en cours d'exécution au premier plan lorsque l'utilisateur tente de la lancer une seconde fois. L'exemple suivant utilise setAlwaysOnTop(true) pour amener une fenêtre au premier plan. Cela aura toutefois pour effet de rendre la fenêtre « topmost », ce qui signifie qu'elle se superposera à toutes les autres fenêtres du bureau même si l'utilisateur clique sur l'arrière-plan. Ce comportement peut être annulé en appelant setAlwaysOnTop(false).

Exemple :
public void fired( WrapperEvent event )
{
    if (event instanceof WrapperSecondInvocationEvent )
    {
        // requires java 1.5 or later
        frame.setAlwaysOnTop(true); // bring the window to the top
        frame.setAlwaysOnTop(false);  // remove the topmost feature
    }
}

AVERTISSEMENT

En activant cette propriété, un canal nommé sera ouvert pour permettre la communication entre les deux instances du Wrapper. Sachez que toute application s'exécutant sous le même utilisateur, ou sous un utilisateur disposant de privilèges plus élevés, est potentiellement en mesure de communiquer via le canal et ainsi de déclencher l'événement. Cela peut constituer un problème de sécurité et il incombe à l'application Java d'exécuter un code sûr à cet égard.

wrapper.single_invocation.notify.focus_window

Compatibilité :3.5.28
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community (non prise en charge)
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

Cette propriété est définie sur TRUE par défaut et donnera le focus à la première fenêtre visible (dans l'ordre z) de l'application Java lorsque l'utilisateur tente de la lancer une seconde fois. S'il n'existe pas de telle fenêtre, une tentative sera faite pour donner le focus à une fenêtre du Wrapper qui surveille l'application en cours d'exécution. Cette fonctionnalité n'est disponible que si wrapper.single_invocation.notify est défini sur TRUE.

Techniquement, l'application Java ne peut pas activer ses propres fenêtres, car elle n'est pas l'application active au moment où l'utilisateur tente de lancer une seconde instance. Lorsque le Wrapper qui surveille l'application Java reçoit une notification d'une autre instance, il communiquera en retour les informations nécessaires afin que l'instance lancée par l'utilisateur puisse activer la fenêtre appropriée. Dans tous les cas, cela sera effectué après le déclenchement de l'événement, donnant ainsi à l'application Java la possibilité de placer sa fenêtre préférée en tête de l'ordre z.

Sauf si vous souhaitez exécuter des actions personnalisées n'impliquant aucune fenêtre, vous devriez toujours laisser cette propriété définie sur TRUE, car il peut être déroutant d'amener une fenêtre au premier plan alors que le focus reste défini sur une fenêtre en arrière-plan.

wrapper.single_invocation.notify.timeout

Compatibilité :3.5.28
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community (non prise en charge)
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

Cette propriété spécifie le délai maximal (en secondes) pendant lequel le Wrapper attendra une réponse de l'instance en cours d'exécution. À défaut, il affichera un message d'erreur et s'arrêtera. La valeur par défaut est de 15 secondes. Sauf si les actions déclenchées par l'événement mettent trop de temps à s'exécuter, la réponse devrait arriver sans latence.

wrapper.single_invocation.notify.show_splashscreen

Compatibilité :3.5.28
Éditions :Édition ProfessionnelleÉdition StandardÉdition Community (non prise en charge)
Plateformes :WindowsMac OSX (Non pris en charge)Linux (Non pris en charge)Alpine Linux (Non pris en charge)FreeBSD (Non pris en charge)Solaris (Non pris en charge)IBM z/Linux (Non pris en charge)

En mode d'invocation unique, le comportement par défaut consiste à ne pas afficher l'écran de démarrage lorsque le Wrapper est lancé une seconde fois. Si les actions déclenchées par l'événement mettent trop de temps à s'exécuter, il peut être utile d'afficher l'écran de démarrage. Cela peut se faire en définissant cette propriété sur TRUE.

Référence : Invocation unique