ProgressMonitor V2 : Un agent de traitements asynchrones pour JavaFX

En deux mots...

Voici une version refondue du ProgressMonitor (code restructuré, documentation élargie, et amélioration du Notifier) ; il permet toujours, contrairement à "Une Popup modale pour application JavaFX" (qui était seulement une Popup de Notification), de suivre les progrès d'une tâche longue sans bloquer l'application.

Les évolutions Java des dernières années ont produit plusieurs "solutions" génériques à cette fin : Future, Worker, Task ou Service, Reactive Programming, etc. Tout en restant assez proche des bases de ces idées (bases probablement aussi anciennes que les premiers pas de l'informatique multi-tâche), le composant présenté ici s'en distingue sur deux aspects :

1. Il n'est pas générique : il se présente de prime abord comme un objet graphique dans la javafx.scene, construit comme une extension d'AnchorPane, comportant quelques champs d'affichage read-only (type Label), un visualiseur d'évolution quantitative (type ProgressIndicator) et un unique bouton multifonction (type Button) ;
2. Il est simple à comprendre (et donc à modifier, si besoin), ses rouages internes étant entièrement accessibles et n'utilisant que des outils classiques et bien connus.


La librairie ProgressMonitor est accompagnée ici d'une "application témoin", TestMonitor, qui permet de voir quelques utilisations concrètes de la Popup. Trois "missions" servent d'exemples :

1. Lancé via le bouton "Try download...", un téléchargement en http depuis le WEB, qui se nourrit de deux paramètres : l'URL source (à entrer préalablement dans le premier champ tout au-dessus) et un répertoire local de destination à saisir via un DirectoryChooser. Le chargement lui-même est défini/implémenté dans la méthode "executeWebDownload()" de la classe ProgressWorkerImpl et est, pour l'essentiel, super classique ;

2. Lancée via le bouton "Load verified...", la même mission, mais complétée pour calculer à la volée une signature Sha-1 qui est en finale comparée à la signature publiée (troisième paramètre dans ce cas, à copier dans la zone sous les boutons). L'intérêt de cette version est d'exploiter, si les deux signatures sont différentes, la possibilité de bloquer temporairement le Moniteur pour déclencher une autre Popup de notification qui permet de demander à l'utilisateur s'il souhaite ou non conserver le fichier téléchargé. S'il répond (vite assez) "Keep", le fichier est gardé; dans les autres cas (click sur "Remove", ou attente trop longue), il est supprimé du disque. L'un ou l'autre de ces événements libère le Moniteur ;

3. Lancé via le bouton "Try counting...", un scan d'un répertoire calculant le nombre de ses sous-répertoires, le nombre de tous les fichiers ordinaires et la somme de leurs tailles en octets (résultat facile à contrôler sur Windows via les Propriétés du répertoire source). Cette mission permet de montrer l'insertion d'une fonction récursive dans la mission ; elle requiert un seul paramètre, le chemin complet vers le répertoire à scanner (dans le champ du dessus ; s'il est vide, un DirectoryChooser apparaît).



Pour ce release V2, le code a été restructuré et étendu, et V2 contient maintenant sept fichiers. Les sources sont groupées en quatre sous-projets, les deux premiers pouvant être réutilisés séparément :

1. src-ModalNotifier.zip
qui contient les sources de la nouvelle popup de notification, ModalNotifier, qui remplace la "popup modale" précédente et ajoute le principe d'exclusion...;

2. src-WorkerEngine.zip
qui contient les sources du moteur asynchrone et la gestion de son thread, groupées en un package, "workerEnginePKG", contenant le noyau (abstrait) de l'exécutant (WorkerKernel), son pilote (WorkerPilot), et l'énumération des Etats et des Actions ;

3. src-ProgressMonitor.zip
qui contient les sources de la popup ProgressMonitor, réparties en deux packages : "monitorWidgetPKG", qui contient la définition graphique FX et son pilote (MonitorPilot, qui étend le WorkerPilot), et "monitorWorkerPKG", qui contient le ProgressWorker (qui étend le WorkerKernel ci-dessus, tout en restant encore toujours abstrait) ;

4. src-TestMonitor.zip
qui contient les sources de la maquette d'Application, TestMonitor, réparties elles aussi en deux packages : "testMonitorMainPKG", qui contient le Main, le fxml, le css et le Controller de l'Appli, et "testPopupWorkerPKG", qui contient la classe concrète, ProgressWorkerImpl, qui implémente le ProgressWorker ci-dessus.

A quoi s'ajoutent

5. dist.zip
qui contient tout ce qu'il faut pour exécuter la maquette. Il suffit d'extraire le tout dans un répertoire et de lancer TestMonitor.jar (un double-click sous Windows, si une jvm 8 est installée). Dans le sous-répertoire "lib" se trouve bien entendu le binaire ProgressMonitor.jar, ainsi que les librairies (.jar) requises pour pouvoir recompiler ;

6. Vade Mecum.pdf
un document de présentation plus complet, avec quelques copies d'écran.

7. TestMonitor flows.pdf
qui donne un schéma global des liens entre les composants de TestMonitor.
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.
Responsables bénévoles de la rubrique Java : Mickael Baron - Robin56 -

Partenaire : Hébergement Web