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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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

Code : Sélectionner tout - Visualiser dans une fenêtre à part
public abstract class AEtapeExecutable implements Callable<AEtapeExecutable>
Et de définir ainsi call :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 ?