Votre application peut nécessiter l'exécution de tâches planifiées ou la réalisation d'actions à des moments spécifiques ou à intervalles réguliers. Par exemple :


Nous vous expliquons ici comment réaliser tout cela avec le Java Service Wrapper.

Solution

Le Java Service Wrapper offre un moyen de planifier des tâches telles que des redémarrages, des arrêts, des dumps de threads, des événements personnalisés, etc. de manière multiplateforme grâce à la fonctionnalité de minuterie du Wrapper.

Les minuteries sont définies dans le fichier de configuration du Wrapper, ce qui permet de regrouper de manière fiable tous ces paramètres au sein même de l'application. Cela facilite le déploiement de l'application sur plusieurs serveurs en ayant l'assurance que tout fonctionnera de manière cohérente.

Les minuteries peuvent être planifiées pour des heures et des jours de la semaine spécifiques, ou à des intervalles allant d'une fois par semaine jusqu'à chaque seconde. Cette flexibilité facilite la planification des sauvegardes ou des arrêts aux moments qui gênent le moins vos utilisateurs. Elle permet également à vos administrateurs système de réduire les heures supplémentaires en travaillant selon des horaires normaux.

Aperçu technique

Le Wrapper vous permet de définir plusieurs minuteries, chacune utilisant une paire de propriétés. La première propriété, wrapper.timer.<n>.interval, est utilisée pour indiquer quand la minuterie doit se déclencher. La seconde propriété, wrapper.timer.<n>.action, est utilisée pour indiquer quelle action ou quelles actions doivent avoir lieu.

Propriété : wrapper.timer.<n>.interval

La propriété wrapper.timer.<n>.interval peut être utilisée pour déclencher l'action à des moments ou des intervalles spécifiques. Des caractères génériques peuvent être utilisés pour spécifier des intervalles. Voici quelques exemples, mais veuillez consulter la documentation complète de la propriété pour découvrir toutes les possibilités.

Exemple de configuration : Tous les jours à 03 h 55
wrapper.timer.1.interval=hour=3; minute=55
Exemple de configuration : Tous les lundis à 03 h 55
wrapper.timer.1.interval=day-of-week=2; hour=3; minute=55
Exemple de configuration : Toutes les 5 secondes
wrapper.timer.1.interval=second=*/5

Propriété : wrapper.timer.<n>.action

La propriété wrapper.timer.<n>.action est utilisée pour indiquer l'action, ou ce qui se produit, lorsque la minuterie se déclenche. Dans la plupart des cas, il s'agit d'une action unique, mais plusieurs actions peuvent être séparées par une virgule afin de les exécuter successivement. Voici quelques exemples, mais veuillez consulter la documentation complète de la propriété pour découvrir toutes les possibilités.

Exemple de configuration : Effectuer un dump de threads
wrapper.timer.1.action=dump
Exemple de configuration : Effectuer un dump de threads puis redémarrer la JVM
wrapper.timer.1.action=dump, restart

Définir plusieurs minuteries :

Si vous souhaitez déclarer plusieurs minuteries, ajoutez simplement des propriétés supplémentaires en utilisant des numéros uniques à la place du 1 ci-dessus.

Exemple de configuration : Plusieurs minuteries pour effectuer des dumps de threads à 03 h 55, 12 h 55 et 21 h 55 chaque jour
wrapper.timer.1.interval=hour=3; minute=55
wrapper.timer.1.action=dump
wrapper.timer.2.interval=hour=12; minute=55
wrapper.timer.2.action=dump
wrapper.timer.3.interval=hour=21; minute=55
wrapper.timer.3.action=dump

Nous allons maintenant présenter quelques utilisations intéressantes des minuteries avec vos applications.

Redémarrages

Compatibilité :3.3.0
Éditions :Édition ProfessionnelleÉdition Standard (non prise en charge)Édition Community (non prise en charge)
Plateformes :WindowsMac OSXLinuxAlpine LinuxFreeBSDSolarisIBM z/Linux

L'une des actions de minuterie les plus courantes à enregistrer est un redémarrage planifié de la JVM. Les redémarrages sont souvent nécessaires pendant les périodes d'arrêt pour contourner les fuites de mémoire ou de ressources, resynchroniser avec des bases de données externes, ou simplement recharger la configuration du Wrapper.

Lorsqu'une application présente une fuite de mémoire connue, un administrateur système doit souvent contourner le problème jusqu'à ce que la fuite sous-jacente puisse être corrigée par le fournisseur de la JVM, de l'application ou de la bibliothèque. Même lorsque l'application est un système interne, il peut souvent falloir un certain temps à l'équipe de développement pour résoudre le problème. Entre-temps, si une fuite n'est pas prise en charge, la JVM commencera souvent à rencontrer des erreurs de mémoire insuffisante pendant les charges de pointe.

Pour éviter de tels problèmes, le Wrapper peut être configuré afin de redémarrer de manière préventive la JVM aux moments où le nombre d'utilisateurs est connu pour être au minimum. Par exemple à 03 h 00 le dimanche matin.

Exemple de configuration : Redémarrer tous les dimanches à 03 h 00
wrapper.timer.1.interval=day-of-week=1; hour=3
wrapper.timer.1.action=restart
Exemple de sortie de journal :
wrapper  | 2012/06/10 03:00:00 | Timer #1.  Restarting JVM.
jvm 1    | 2012/06/10 03:00:01 | TestWrapper: stop(0)
jvm 2    | 2012/06/10 03:00:06 | WrapperManager: Initializing...
jvm 2    | 2012/06/10 03:00:06 | TestWrapper: Initializing...

Dumps de threads

Compatibilité :3.3.0
Éditions :Édition ProfessionnelleÉdition Standard (non prise en charge)Édition Community (non prise en charge)
Plateformes :WindowsMac OSXLinuxAlpine LinuxFreeBSDSolarisIBM z/Linux

Parfois, lors du débogage d'un problème, il peut être utile de réaliser des dumps de threads à intervalles réguliers pour une analyse ultérieure. Le Wrapper peut facilement être configuré pour le faire à des intervalles de 5 minutes, par exemple.

Exemple de configuration : Demander un dump de threads toutes les 5 minutes
wrapper.timer.1.interval=minute=*/5
wrapper.timer.1.action=dump

AVERTISSEMENT

Si vous essayez ceci, veuillez vous assurer que la taille de votre fichier journal est suffisante pour contenir les dumps.

Pause et reprise

Compatibilité :3.5.0
Éditions :Édition ProfessionnelleÉdition Standard (non prise en charge)Édition Community (non prise en charge)
Plateformes :WindowsMac OSXLinuxAlpine LinuxFreeBSDSolarisIBM z/Linux

Si vous avez configuré votre application pour qu'elle soit suspendable, il est alors possible d'utiliser des minuteries pour mettre en pause et reprendre l'application à des moments spécifiques. Lorsqu'une application est en pause, le Wrapper peut être configuré pour arrêter la JVM tout en maintenant le Wrapper en cours d'exécution. C'est idéal pour planifier des arrêts afin d'effectuer des sauvegardes de bases de données ou d'autres tâches qui ne peuvent pas avoir lieu pendant l'exécution de l'application.

L'exemple de configuration suivant arrêtera la JVM chaque nuit à 03 h 00, puis la reprendra à 04 h 00.

Exemple de configuration : Pause et reprise planifiées
wrapper.timer.1.interval=hour=3
wrapper.timer.1.action=pause
wrapper.timer.2.interval=hour=4
wrapper.timer.2.action=resume

C'est très bien, mais l'application sera toujours arrêtée pendant 1 heure. Et si nous voulons reprendre l'application dès que les sauvegardes nécessaires sont terminées ?

Cela peut être réalisé en utilisant la propriété wrapper.commandfile ainsi que la commande RESUME, émise à la fin de votre script de sauvegarde. La reprise temporisée doit tout de même être configurée au cas où un problème surviendrait dans le script. L'action de reprise de la minuterie sera ignorée si l'application n'est plus en pause.

Tâches Java

Compatibilité :3.5.0
Éditions :Édition ProfessionnelleÉdition Standard (non prise en charge)Édition Community (non prise en charge)
Plateformes :WindowsMac OSXLinuxAlpine LinuxFreeBSDSolarisIBM z/Linux

Une autre utilisation de l'action de minuterie RESUME consiste à lancer des applications Java de courte durée qui doivent effectuer une tâche planifiée puis se terminer. En combinant une action de minuterie RESUME avec une définition de la propriété wrapper.on_exit.<n>, le Wrapper peut être configuré pour entrer dans un état de pause chaque fois que la JVM se termine, puis la relancer lorsque la minuterie se déclenche.

Par exemple, la configuration suivante ne lancera pas de JVM lors du premier démarrage du Wrapper. Elle attendra plutôt, puis lancera la JVM à des intervalles d'une heure, au début de chaque heure. L'application effectuera une tâche puis se terminera. Lorsque c'est le cas, le Wrapper passera dans un état de pause plutôt que de se terminer ou de relancer une JVM. Ce processus se répétera ensuite chaque heure jusqu'à l'arrêt du Wrapper.

Exemple de configuration : Pause et reprise planifiées
wrapper.pausable=TRUE
wrapper.pause_on_startup=TRUE
wrapper.timer.1.interval=minute=60
wrapper.timer.1.action=resume
wrapper.on_exit.default=PAUSE

L'avantage d'exécuter l'application Java uniquement lorsque c'est nécessaire, plutôt que de simplement laisser la JVM inactive, est que vous pouvez économiser considérablement les ressources système en arrêtant le processus JVM lorsqu'il n'est pas nécessaire.

Actions définies par l'utilisateur

Compatibilité :3.5.0
Éditions :Édition ProfessionnelleÉdition Standard (non prise en charge)Édition Community (non prise en charge)
Plateformes :WindowsMac OSXLinuxAlpine LinuxFreeBSDSolarisIBM z/Linux

Le Wrapper permet également de planifier l'exécution de commandes externes, ou l'envoi d'e-mails, à intervalles réguliers. Cela se fait en utilisant des événements d'action définis par l'utilisateur.

L'exemple suivant exécutera un script ou un fichier batch cleanup toutes les 10 minutes.

Exemple de configuration : Exécution planifiée d'une commande de nettoyage
wrapper.event.user_100.command.argv.1=cleanup
wrapper.timer.1.interval=minute=*/10
wrapper.timer.1.action=user_100

Veuillez consulter la page Aperçu des événements pour plus d'informations sur la configuration des commandes ou l'envoi d'e-mails.

Référence : Configurations de propriétés

Le Java Service Wrapper fournit un ensemble complet de propriétés de configuration qui vous permettent d'adapter le Wrapper à vos besoins exacts. Veuillez consulter la documentation des propriétés individuelles pour découvrir toutes les possibilités au-delà des exemples présentés ci-dessus.