Conception "workflow" Java


Je voudrais poser des questions sur la conception de la "fusion de flux de travail". J'ai plusieurs workflows qui ne sont pas très similaires les uns aux autres. Cependant, parfois je veux les combiner en les modifiant très légèrement. Permettez-moi de vous donner un exemple:

Flux De Travail 1 - Voyage

A1 (emballer le sac) - > A2 (quitter la maison) - > A3 (attrapez le bus) - > A4 ...

Workflow 2-Arrosage quotidien des plantes

B1 (allumer l'eau) - > B2 (quitter la maison) - > B3 (arroser les plantes) - > B4 (entrez dans la maison) - > B5 (éteignez l'eau)

Le dimanche, je veux faire un voyage et j'ai besoin d'arroser les plantes aussi. Je veux donc créer quelque chose comme A1 -> B1 à B5 -> A2... . Je veux aussi avoir la possibilité de dire à mon ami de terminer l'arrosage, ce qui serait quelque chose comme A1 -> B1 à B2 -> C1 (passez la tâche à un ami) -> A3 ... Comme vous pouvez le voir, le flux est simple - il n'y a pas de forks et de jointures et je n'en ai pas besoin fonctionnalité. Tout ce dont j'ai besoin est de créer une liste linéaire de commandes avec possibilité de les fusionner facilement. Tous les fragments de code sont des méthodes Java pour le moment (et j'aimerais en faire quelque chose comme des flux atomiques).

L'objectif principal de ma démarche devrait être d'éviter de taper le même code plusieurs fois. Le flux peut avoir des centaines d'étapes. Je voudrais faire une déclaration comme Execute flow A, mais au lieu d'exécuter A2 et A3, exécutez B2 à B6 et continuez avec Un.

J'ai deux questions majeures:

  • Y a-t-il un cadre qui soutient déjà cela? S'il y en a, n'est-ce pas trop complexe pour mon but?
  • Sinon, quelle serait la meilleure façon de mettre en œuvre une telle chose?

Remarque : Pouvez-vous préciser ce qui n'est pas clair à propos de ma question?

Author: Danstahr, 2012-10-11

4 answers

Personnellement, je pense que l'exigence peut être mise en œuvre sans l'utilisation d'un cadre spécifique. Vous pouvez concevoir l'application comme suit :

  1. TaskPerformer: Une interface avec une méthode nommée performTask. Représente une tâche à effectuer.

  2. BagPackTask: Une classe concrète qui implémente TaskPerformer. Définit également la méthode performTask qui contient du code pour emballer un sac.

  3. WaterPlantsTask: Une autre classe de béton qui implémente TaskPerformer. Définit également la méthode performTask qui contient du code pour l'arrosage des plantes. De même, vous avez une classe par tâche qui implémente Taskperformer et définit le comportement de la tâche à l'aide de la méthode performTask.

  4. Workflow: Une classe qui sera utilisée pour exécuter deux ou plusieurs tâches et vous permettra de mélanger et de faire correspondre les tâches existantes. La classe contiendra une liste de TaskPerformer et le constructeur de cette classe aura un paramètre List à demander pour les Tâches à exécuter. La classe contiendra une méthode executeWorkflow qui itérera sur la liste et appellera la méthode performTask de chaque élément de la liste. En d'autres termes, cette classe peut être utilisée pour exécuter toutes les tâches passées à son constructeur lors de l'instanciation en utilisant sa méthode executeWorkflow. Il est important de noter que l'ordre dans lequel l'insertion d'éléments dans la liste correspond à l'ordre dans lequel les tâches seront exécutées.

En utilisant cette approche, vous éliminez la nécessité d'avoir des conditions if-else pour déterminer quelle tâche effectuer. Vous pouvez réutiliser vos implémentations TaskPerformer dans le nombre d'instances de Workflow que vous souhaitez. Vous obtenez un design super propre. Faites-moi savoir si vous avez besoin de clarifications car je pense que cette conception devrait résoudre votre problème. Ce serait une bonne idée de clarifier tous vos doutes avant d'accepter des réponses:)

 1
Author: CKing, 2012-10-12 09:00:31

... ou implémentez le modèle de commande . Cela devrait être assez facile sans aucun cadre.

 1
Author: Adam Dyga, 2012-10-12 09:05:28

Spring Batch est très simple à mettre en place et vous permet de soumettre des tâches qui exécutent des tâches dans l'ordre de votre choix. Je recommande cela comme point de départ, pour voir si cela répond à vos besoins. Pour votre cas, je recommanderais de l'exécuter avec une base de données en mémoire, comme HSQLDB, pour éviter les frais généraux de configuration. Vous pouvez toujours enregistrer les résultats de votre travail dans un fichier journal.

Le moteur de flux de travail le plus mature et le plus entreprenant est probablement JBPM, mais cela semble un peu lourd pour ce que vous devez faire.

 0
Author: Paul Sanwald, 2012-10-11 12:50:24

Jetez un oeil àOSWorkflow , il est vraiment agréable, léger et vous fournit toutes les machines FSM hors de la boîte.

 0
Author: jdevelop, 2012-10-11 21:41:49