Bonjour,
Dans le cadre d'un moteur d'exécution de workflow modélisant des diagrammes de Gantt, j'ai retenu les solutions techniques suivantes.
Fonctionnement du Gantt : chaque étape a des parents et des enfants.
La boucle principale traite les étapes dans "l'ordre d'arrivée" et propage l'évènement associé (exemple : fin d'une étape => on démarre les enfants).
Pourriez-vous me donner votre avis sur les choix plus bas ?
Grand merci !
Franck
Pour l'exécution
1 2 3 4 5
|
// Instanciation de la mécanique de multithreading
ExecutorService threadExecutor = Executors.newFixedThreadPool(nombreThreadsMax);
CompletionService<AEtapeExecutable> completionService = new ExecutorCompletionService<AEtapeExecutable>(threadExecutor); |
Ici j'utilise un ExecutorService pré-paramétré car je n'ai pas besoin de la logique complète d'un ThreadPoolExecutor ==> est-ce OK ?
Pour la boucle principale
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
// Initialisation du compteur de threads
int nombreThreadsEnCours = 0;
try {
// On démarre l'étape initiale
nombreThreadsEnCours = demarrerEtape(completionService, etapeComposee);
while (nombreThreadsEnCours != 0) {
// Attente de la fin de la prochaine exécution (appel bloquant!)
AEtapeExecutable etapeCourante = completionService.take().get();
// On décrémente le compteur
nombreThreadsEnCours -= 1;
// Exécution courante OK ?
boolean isExecutionCouranteOk = etapeCourante.getStatutExecution() != EStatutExecutionEtape.KO;
// On notifie le résultat aux enfants
nombreThreadsEnCours += propagerEvenement(completionService, etapeCourante, ETypeEvenement.FIN, isExecutionCouranteOk);
} |
Ici je choisis de maintenir mon propre compteur de threads ; en effet la méthode getActiveCount() d'un ThreadPoolExecutor n'est pas assez fiable ==> est-ce OK ?
Pour la définition des tâches
J'ai choisi de définir ainsi mes tâches
public abstract class AEtapeExecutable implements Callable<AEtapeExecutable>
Et de définir ainsi call :
1 2 3 4 5 6 7
|
public AEtapeExecutable call() {
...
return this;
} |
Ceci pour que la boucle plus haut connaisse l'étape qui vient de se terminer ==> est-ce OK ?
Partager