2016-09-19 2 views
1

J'ai deux "tâches de service" synchrones distinctes dans le diagramme BPMN2.0 - "Action 1" et "Action 2". Après l'exécution réussie de "Action 1", un événement extérieur est attendu (une action en dehors du système géré par le moteur BPM). Après l'événement, "Action 2" doit être exécutée immédiatement (encore une fois, tâche de service synchrone). La partie compliquée pour moi est comment définir le délai d'attente pour l'événement, ce qui signifie que l'événement est attendu, mais seulement pour un certain temps (par exemple 1 minute) ... Ensuite, une gestion d'erreur timeout devrait être exécutée. Donc, l'action 2 doit être exécutée entre 0 et 60 secondes après l'action 1, dès que possible ou pas du tout.Evénement intermédiaire ou temporisateur en BPM

Une idée pour y parvenir sans utiliser de tâche asynchrone (voir la deuxième image)?

J'ai une idée (troisième photo), mais je ne sais pas si cela fonctionnerait comme prévu ...

Le schéma sera exécuté dans le moteur Activiti BPM ...

synchrone exécution

Synchronous execution

Async excecution

Async excecution

solution proposée

enter image description here

+0

Je ne l'ai pas utilisé Activiti avant (je ne l'ai utilisé mon propre implémentations bpm), mais je pense que vous devriez être capable d'accomplir votre scénario en créant une séquence de: tâche de service java (action 1), tâche de réception java (attente d'un événement externe) et tâche de service java (action 2). Afin d'implémenter le délai d'attente sur la tâche de réception, vous devez attacher l'événement de limite de temporisation sur la tâche de réception java. –

+0

merci, une question de plus - est-il possible d'implémenter la longueur de timeout en tant que variable pour instance de processus ou il doit être défini dans la spécification de processus (xml)? – tomas

+0

Il semble être possible: http://www.activiti.org/userguide/#timerEventDefinitions –

Répondre

2

Qu'est-ce que vous avez besoin entre Action 1 et 2 est une 'tâche de recevoir': voir http://activiti.org/userguide/index.html#bpmnReceiveTask. Le moteur ne continuera pas à moins qu'un appel d'API soit effectué (runtimeService.signal dans v5, runtimeService.trigger dans v6). Ajoutez un événement de limite de temporisation (comme sur la troisième image) pour vous assurer que le processus instancé

1

Vous pouvez utiliser le EventBasedGateway, qui attendra jusqu'à ce qu'un message arrive ou jusqu'à ce que le temporisateur se déclenche après une minute. En fonction de l'événement, le flux de séquence correspondant sera utilisé et l'activité suivante sera exécutée.

EventBasedGateway

Voir la documenation pour plus d'informations sur le EventBasedGateway.

0

Une autre option serait d'envelopper le message recevoir l'événement et l'action 2 dans un sous-processus intégré avec un événement de minuterie limite