Présentation de jBPM 3.1

117
opyleft Thibault Cuvillier WS 1.0 - Template 1. jBPM 3.1 Thibault Cuvillier Jav@rchitecte Consultant indépendant [email protected] www.btcweb.com

description

Présentation de jBPM version 3.1.

Transcript of Présentation de jBPM 3.1

Page 1: Présentation de jBPM 3.1

Cop

yle

ft T

hib

au

lt C

uvillier

WS 1.0 - Template 1.0

jBPM 3.1

Thibault CuvillierJav@rchitecte

Consultant indé[email protected]

www.btcweb.com

Page 2: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

Survol de jBPM

Un premier exemple avec jBPM

Page 3: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 3

Survol de jBPM

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 4: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 4

Qu'est-ce que jBPM ?

• jBPM est un système de gestion de workflow• Permet de:

– Décrire graphiquement les processus métier– Attendre pour les communications asynchrones– Automatiser des actions– …

• Fonctionne avec J2SE ou J2EE• Fonctionne avec n'importe quelle base de

donnée

Page 5: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 5

Qu'est-ce qu'un workflow ?

• Un processus orchestre l'exécution de tâches et d'actions– Informatiques ou

humaines,– Synchrones ou asynchrones

• Le processus change d'état lorsdu déclenchement d'unetransition– Un acquittement par un

utilisateur– Un acquittement informatique

Page 6: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 6

jBPM est une API Java

• Ce que n'est pas jBPM:– Pas de serveur à lancer

• Ce qu'est jBPM:– Une API– Application Java, Web ou EJB

API JavaAPI Java

JMS

SOAP

IIOP

Page 7: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 7

Un premier exemple 1/2

• Le processus est décrit par un fichier XML– Etat (initial, final, intermédiaire) et transitions

<?xml version="1.0" encoding="UTF-8"?>

<process-definition name="helloWorld"> <start-state name="debut"> <transition name="" to="hello"/> </start-state> <end-state name="fin"/> <state name="world"> <transition name="" to="fin"/> </state> <state name="hello"> <transition name="" to="world"/> </state></process-definition>

<?xml version="1.0" encoding="UTF-8"?>

<process-definition name="helloWorld"> <start-state name="debut"> <transition name="" to="hello"/> </start-state> <end-state name="fin"/> <state name="world"> <transition name="" to="fin"/> </state> <state name="hello"> <transition name="" to="world"/> </state></process-definition>

Page 8: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 8

Un premier exemple 2/2

• Le programme de test:– signal déclenche la transition par défaut de l'état

courrant

ProcessDefinition definition = ProcessDefinition.parseXmlResource("helloWorld.par/processdefinition.xml");

ProcessInstance processus = new ProcessInstance(definition);

Token token = processus.getRootToken();assertEquals(definition.getStartState(), token.getNode());token.signal();assertSame(definition.getNode("hello"), token.getNode());token.signal();assertSame(definition.getNode("world"), token.getNode());token.signal();assertSame(definition.getNode("fin"), token.getNode());

ProcessDefinition definition = ProcessDefinition.parseXmlResource("helloWorld.par/processdefinition.xml");

ProcessInstance processus = new ProcessInstance(definition);

Token token = processus.getRootToken();assertEquals(definition.getStartState(), token.getNode());token.signal();assertSame(definition.getNode("hello"), token.getNode());token.signal();assertSame(definition.getNode("world"), token.getNode());token.signal();assertSame(definition.getNode("fin"), token.getNode());

Page 9: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 9

Processus métiers persistants

• La définition des processus est stocké dans la base de données– Permet d'attendre le résultat d'un traitement

asynchrone• La définition des processus métier doit être

déployée dans la base.JpbmProcessDefinition definition = …;JbpmConfiguration configuration = …;

JbpmContext jbpmContext = configuration.createJbpmContext();context.deployProcessDefinition(definition);

JpbmProcessDefinition definition = …;JbpmConfiguration configuration = …;

JbpmContext jbpmContext = configuration.createJbpmContext();context.deployProcessDefinition(definition);

Nous verrons plus loinNous verrons plus loin

GraphSession graphSession = jbpmContext.getGraphSession();ProcessDefinition definition = graphSession.findLatestProcessDefinition("hello world"); GraphSession graphSession = jbpmContext.getGraphSession();ProcessDefinition definition = graphSession.findLatestProcessDefinition("hello world");

Page 10: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 10

Actions 1/2

• Les actions sont déclenchés lors de reception d'événements:– Entrée dans un état– Sortie d'un état– Déclenchement d'une transistion– …

<state name="hello"> <transition name="" to="world"/> <event type="node-enter"> <action name="AfficheHello" class="com.btc.process.helloWorld.AfficherHello"/> </event></state>

<state name="hello"> <transition name="" to="world"/> <event type="node-enter"> <action name="AfficheHello" class="com.btc.process.helloWorld.AfficherHello"/> </event></state>

Page 11: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 11

Action 2/2

• Une action est une classe Java qui implémente ActionHandler

public class AfficherHello implements ActionHandler {public void execute(ExecutionContext executionContext) throws Exception {

System.out.println("============> Hello !");}

}

public class AfficherHello implements ActionHandler {public void execute(ExecutionContext executionContext) throws Exception {

System.out.println("============> Hello !");}

}

Page 12: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 12

Variables de processus

• Des variables peuvent être stockées et récupérées dans le contexte d'une instance– Dans une Map<String, Object>

JbpmProcessInstance instance = … récupérer une instance de processus …;ContextInstance context = instance.getContextInstance();context.setVariable("hello", "Hello, Bonjour, Ola !");…

JbpmProcessInstance instance = … récupérer une instance de processus …;ContextInstance context = instance.getContextInstance();context.setVariable("hello", "Hello, Bonjour, Ola !");…

public class AfficherHello implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { String msg = (String)executionContext.getContextInstance().getVariable("hello"); System.out.println("============> " + msg); }}

public class AfficherHello implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { String msg = (String)executionContext.getContextInstance().getVariable("hello"); System.out.println("============> " + msg); }}

Page 13: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 13

Travaux Pratiques

• Pas de codage• Ouvrez le projet JBPM-Demontration

– Exécutez DeployHelloWorld pour déployer le processus

– Exécutez ExecuteHelloWorld• Regardez la définition du processus• Regardez le code Java• Comprenez le lien entre les deux

Page 14: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Graphe et Contexte

Page 15: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 15

Graphe et Contexte

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 16: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 16

Graphe 1/2

• jBPM est basé sur un modèle de graphe générique– Dans org.jbpm.graph

• Un GraphElement contient:– Des Event permettant de déclencher des actions,– Des ExceptionHandler pour traiter les exceptions.

NodeNode TransitionTransition

sortante

entrantefinale

initiale**

11ProcessDefinitionProcessDefinition *1

classclassEventEvent ExceptionHandlerExceptionHandler* **

ActionAction GraphElementGraphElement

Page 17: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 17

Graph 2/2

• Graph Oriented Prgramming• jBPM est une solution de GOP

– Automates• Permet de contrôler par exemple

l'enchaînement des pages sur un site Web– JBoss SEAM avec JSF

• Organisation des packages:

org. jbpm.graphorg. jbpm.graph

serviceservice serviceservice

Par exemple: gestion des tâches gestion de la persistance gestion de la messagerie …

Par exemple: gestion des tâches gestion de la persistance gestion de la messagerie …serviceservice

Page 18: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 18

JbpmContext

• Contexte permettant d'accéder aux données– Un objet par thread

• Créé à partir d'un fichier de configuration– Par défaut, recherche jbpm.cfg.xml dans le classpath– JbpmConfiguration est un singleton pour une

application

• Tous les services sont créé par des factories– Peuvent être redéfinies– jBPM est très extensible

JbpmConfiguration configuration = JbpmConfiguration.getInstance();JbpmContext jbpmContext = configuration.createJbpmContext();JbpmConfiguration configuration = JbpmConfiguration.getInstance();JbpmContext jbpmContext = configuration.createJbpmContext();

Page 19: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 19

• Manipulation des graphes:– ProcessDefinition et

ProcessInstance• Conserve trace de l'exécution

des processus– Consultation, Undo, Statistiques

• Gestion de messages asynchrones

• Gestion du temps, des timers• Gestion des tâches, Todolist

Les sous contextes de JbpmContext

LoggingSessionLoggingSession

MessagingSessionMessagingSession

SchedulerSessionSchedulerSession

GraphSessionGraphSession

TaskMgmtSessionTaskMgmtSession

JbpmContextJbpmContext

Page 20: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 20

Méthodes de JBpmContext

• static JbpmContext getCurrentJbmpContext()– Retourne le contexte courant (un par thread)

• Connection getConnection()– Retourne la connexion JDBC sous jacente

• Session getSession()– Retourne la session Hibernate sous jacente

• setActorId(String actorId), getActorId()– Acteur courant authentifié

Page 21: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 21

Travaux pratique

• JBPM-Lab01-Context-Question

Page 22: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Processus, Etat et Transition

Page 23: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 23

Processus, Etat et Transition

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 24: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 24

Processus

ProcessusEtat et Transition

Page 25: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 25

Définition d'un processus

• Dans un fichier XML– Schéma spécifique JBoss– Support de BPEL (Business Process Execution

Language)

• La description du processus devra être déployé dans la base de données– Dans une nouvelle version du processus

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="recrutement"> <start-state>… </start-state> <state>… </state></process-definition>

<?xml version="1.0" encoding="UTF-8"?>

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="recrutement"> <start-state>… </start-state> <state>… </state></process-definition>

Page 26: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 26

Etats et versions d'un processus

• Lorsque vous deployez un nouveau processus dans la base, jBPM va créer une nouvelle version.– Vous pouvez nettoyer la base avec un batch

• Un processus doit être démarré• Un processus peut être suspendu

– Lors de communications asynchrones– Lors de l'utilisation de sous-processus– Nous verrons ces points

plus loin

Not startedNot started

TerminatedImplicitlyTerminatedImplicitly

SuspendedSuspended

End-stateEnd-state

StartedStarted

Page 27: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 27

Manipulation des définitions de processus

• Chargement de la définition d'un processus

• Chargement dans la base d'un processus

• Liste de toutes les version d'un processus

• Récupérer la dernière version d'un processus

• Destruction d'un processus

ProcessDefinition definition = ProcessDefinition.parseXmlResource("processus.xml");ProcessDefinition definition = ProcessDefinition.parseXmlResource("processus.xml");

jbpmContext.deployProcessDefinition(definition);jbpmContext.deployProcessDefinition(definition);

List<ProcessDefinition> graphSession.findAllProcessDefinitionVersions("recrutement");List<ProcessDefinition> graphSession.findAllProcessDefinitionVersions("recrutement");

graphSession. deleteProcessDefinition(processDefinition);graphSession. deleteProcessDefinition(processDefinition);

ProcessDefinition graphSession.findLatestProcessDefinition();ProcessDefinition graphSession.findLatestProcessDefinition();

Page 28: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 28

Manipulation des instances de processus

• Lecture des instances d'un processus

• Création d'une nouvelle instance d'un processus

• Destruction d'une instance de processus

List<ProcessInstance> graphSession.findProcessInstances(long processDefinitionId) List<ProcessInstance> graphSession.findProcessInstances(long processDefinitionId)

ProcessInstance jbpmContext.newProcessInstances(Stirng processName) ProcessInstance jbpmContext.newProcessInstances(Stirng processName)

graphSession.deleteProcessInstance(long processInstanceId)graphSession.deleteProcessInstance(long processInstanceId)

Page 29: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 29

Exemple: Déployer un processus dans la base

• Création d'une nouvelle version du processus• Les instances de l'ancienne version

continuent de fonctionnerProcessDefinition definition = ProcessDefinition.parseXmlResource("process.xml");

GraphSession graphSession = jbpmContext.getGraphSession();

List<ProcessDefinition> processDefinitions = graphSession.findAllProcessDefinitionVersions("recrutement");for(ProcessDefinition processDefinition: processDefinitions) graphSession.deleteProcessDefinition(processDefinition);jbpmContext.close(); // commit

jbpmContext = configuration.createJbpmContext();jbpmContext.deployProcessDefinition(definition);jbpmContext.close(); // commit

ProcessDefinition definition = ProcessDefinition.parseXmlResource("process.xml");

GraphSession graphSession = jbpmContext.getGraphSession();

List<ProcessDefinition> processDefinitions = graphSession.findAllProcessDefinitionVersions("recrutement");for(ProcessDefinition processDefinition: processDefinitions) graphSession.deleteProcessDefinition(processDefinition);jbpmContext.close(); // commit

jbpmContext = configuration.createJbpmContext();jbpmContext.deployProcessDefinition(definition);jbpmContext.close(); // commit

Page 30: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 30

Transaction

• La création d'un contexte ouvre une transaction

• La fermeture du contexte termine la transaction– rollback si setRollbackOnly a été appelé– Sinon, commit

• Toujours écrire votre code sous cette forme:JbpmContext jbpmContext = configuration.createJbpmContext();try { …} catch(Exception e) { jbpmContext.setRollbackOnly(); throw e;} finally { jbpmContext.close();}

JbpmContext jbpmContext = configuration.createJbpmContext();try { …} catch(Exception e) { jbpmContext.setRollbackOnly(); throw e;} finally { jbpmContext.close();}

Page 31: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 31

Contexte de persistance

• Les objets persistants sont gérés dans un cache par Hibernate– Evite de charger un objet deux fois en mémoire– Moins de SQL

• Le cache est transactionnel– Les objets ne sont plus liés au contexte de

persistance– Il faut les recharger

• Méthodes loadXxx, loadXxxForUpdate– Lecture d'une donnée de la base– Méthodes ForUpdate: pour modifier les données

Page 32: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 32

Save

• Méthodesave

• Si vous utilisez loadXxxForUpdate, pas la peine d'appeler save()

JbpmContext jbpmContext = configuration.createJbpmContext();

try {ProcessInstance processInstance = jbpmContext.loadProcessInstance(id);processInstance.signal();jbpmContext.save(processInstance);

} catch(Exception e) { jbpmContext.setRollbackOnly();} finally { jbpmContext.close();}

JbpmContext jbpmContext = configuration.createJbpmContext();

try {ProcessInstance processInstance = jbpmContext.loadProcessInstance(id);processInstance.signal();jbpmContext.save(processInstance);

} catch(Exception e) { jbpmContext.setRollbackOnly();} finally { jbpmContext.close();}

Commit ou rollback dela transaction

Commit ou rollback dela transaction

Après cette ligne, il ne faut plus utiliser

processInstance

Après cette ligne, il ne faut plus utiliser

processInstance

Page 33: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 33

Token

• Un token contient laréférence sur l'état courant– L'état courant est un nœud

• Pour récupérer l'état courant:– Conversion en StartState, EndState, State …

• Pour changer d'état dans le code– Ne s'utilise que pour

traiter les erreurs• Un processus peut avoir plusieurs états

courants– Split, merge

Token token = processInstance.getRootToken();Token token = processInstance.getRootToken();

Node node = token.getNode();Node node = token.getNode();

Node node = processDefinition.getNode("etat");token.setNode(node);Node node = processDefinition.getNode("etat");token.setNode(node);

Page 34: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 34

Etat et transition

ProcessusEtat et Transition

Page 35: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 35

Types de nœuds 1/2

• Un processus est constitué de nœuds et de transitions– Diagramme état-transition

• start-state– état initial du processus lors de sa création– un par processus

• end-state– état final du processus

• state– état d'attente

Page 36: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 36

Types de nœuds 2/2

• decision– permet de déclencher une transition parmi plusieurs

en fonction d'un choix• task-node

– exécution d'une tâche humaine• process-state

– permet de déclencher un sous processus• super-state

– permet d'imbriquer des états• fork et join

– permet de paralléliser et de synchroniser des activités

Page 37: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 37

Transition

• Les transitions permettent de changer d'état– Les transitions sont identifiées par un nom

• Un état peut avoir une transition sans nom– La transition par défaut

Page 38: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 38

<start-state> et <end-state>

• StartState: Etat initial du graphe– Un seul par graphe– Que des transitions sortantes

• EndState– Plusieurs par graphe possible– Que des transitions entrantes

<start-state name="celibataire"> <transition name="se marier" to="marié"/> <transition name="décéder" to="mort"/></start-state>

<end-state name="mort"/>

Page 39: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 39

<state>

• State: Etat générale– Le processus attend un événement pour

continuer<start-state name="mineur"> <transition name="a 18 ans" to="célibataire"/> <transition name=" décéder " to="mort"/></start-state>

<state name="célibataire"> <transition name="se marier" to="marié"/> <transition name="décéder" to="mort"/></state>

<end-state name="mort"/>

Page 40: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 40

Travaux pratiques

• JBPM-Lab02-Question-Processus

Page 41: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Action, Script et Evénements

Page 42: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 42

Processus, Etat et Transition

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 43: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 43

Action

ActionExpressionScriptEvénement

Page 44: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 44

Processus / Etat / Traitements

• Le processus contrôle l'enchaînement des états• Les états contrôles quels sont les traitements

possibles en fonction de l'état• Les traitements sont ajoutés:

– Par des Actions: du code java– Par des Scripts: Langage de script dans la

description du processus• jBPM comprend également des actions pré-

définis– Manipulation des timers par exemple

• Les traitements sont déclenché lors de changement d'état.

Page 45: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 45

Action

• Définition d'une action sur réception d'un événement (nous verrons les événements + loin):

• Une action implémente l'interface ActionHandlerpublic class FaitCaAction implements ActionHandler {

public void execute(ExecutionContext executionContext) throws Exception { … }}

public class FaitCaAction implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { … }}

FaitCaAction.javaFaitCaAction.java

<state name="Hello"> <event type="node-enter"> <action class="com.btc.FaitCaAction"/> </event></state>

<state name="Hello"> <event type="node-enter"> <action class="com.btc.FaitCaAction"/> </event></state>

processDefinition.xmlprocessDefinition.xml

Nous verrons plus tard cette classeNous verrons plus tard cette classe

Page 46: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 46

Configuration d'une action 1/2

• Une action est une classe Java qui implémente l'interface ActionHandler

• Une action peut avoir des propriétés

public class FaitCaAction implements ActionHandler { private String _message; public void execute(ExecutionContext executionContext) throws Exception { System.out.println(_message); } … getMessage … setMessage …}

public class FaitCaAction implements ActionHandler { private String _message; public void execute(ExecutionContext executionContext) throws Exception { System.out.println(_message); } … getMessage … setMessage …}

AfficherAction.javaAfficherAction.java

<action class="com.btc.AfficherAction" config-type="bean"> <message>Hello World !</message></action>

<action class="com.btc.AfficherAction" config-type="bean"> <message>Hello World !</message></action>

processDefinition.xmlprocessDefinition.xml

Valeur de propriétéValeur de propriété

Page 47: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 47

Configuration d'une action 2/2

• Trois modes de configuration:– config-type="field"

Accès direct aux attributs qui doivent être public– config-type="bean"

Accès les méthodes get et set– config-type="configure-property"

Méthode générique configure(String s)– config-type="constructor"

Méthode générique <constructeur>(String s)

Page 48: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 48

Expression

ActionExpressionScriptEvénement

Page 49: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 49

Expressions EL 1/2

• Une expression EL– Référence à une variable: #{variable},

#{tableau[0]}– Opérateurs: +,-,/,* ,!,== ,!=, <,>,>=, <=,&&, ||

…– Voir: http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JSPIntro7.html

ContextInstance icontext = instance.getContextInstance();icontext.setVariable("monAction", new AfficherHello());ContextInstance icontext = instance.getContextInstance();icontext.setVariable("monAction", new AfficherHello());

<event type="node-enter"> <action name="AfficheHello" expression="#{monAction.maMethode}"/></event>

<event type="node-enter"> <action name="AfficheHello" expression="#{monAction.maMethode}"/></event> EL est utilisable pour de nombreux attributs du fichier XMLEL est utilisable pour de nombreux attributs du fichier XML

Définition de la variable

Définition de la variable

Référence à la méthodeRéférence à la méthode

Page 50: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 50

Expressions EL 2/2

• Les expressions EL peuvent utiliser des variables stockée sur:– taskinstance, processInstance, processDefinition,

token, taskMgmtInstance ou contextInstance– Selon le contexte de l'expression EL

Page 51: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 51

Script

ActionExpressionScriptEvénement

Page 52: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 52

Les scripts beanshell 1/5

• Vous pouvez écrire vos traitements avec un sript– www.beanshell.org, adopté par la JSR-274– Dans le fichier XML– Script java, sera

intégré dans J2SE

• <value> mapune valeur du contexte sur une variable de script

• Object implicite: executionContext– Nous verrons cette classe plus loin

<event type="node-enter"> <script> <expression> for(int i = 0; i < 10; i++) System.out.println(m); </expression> <variable name="message" access="read" mapped-name="m"/> </script></event>

<event type="node-enter"> <script> <expression> for(int i = 0; i < 10; i++) System.out.println(m); </expression> <variable name="message" access="read" mapped-name="m"/> </script></event>

Page 53: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 53

Les scripts beanshell 2/5

• Syntaxe très proche de Java:

• Vous pouvez utiliser toutes les classes Java– Les classes de J2SE– Vos classes

double foo = 0.34;bar = Math.sin(foo)StringBuffer sb = new StringBuffer();sb.append("Hello");

JFrame frame = new JFrame("Hello World !");frame.setVisible(true);

for(int i = 0; i < 10 i++) System.out.println("Hello World !");

double foo = 0.34;bar = Math.sin(foo)StringBuffer sb = new StringBuffer();sb.append("Hello");

JFrame frame = new JFrame("Hello World !");frame.setVisible(true);

for(int i = 0; i < 10 i++) System.out.println("Hello World !");

Les variables sont ou non typées

Page 54: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 54

Les scripts beanshell 3/5

• BeanShell comporte des raccourcis:

• Vous pouvez manipuler collections et tableaux:

Personne personne = new Personne();personne.prenom = "Harry"; // personne.setPrenom("Harry")System.out.println(personne.prenom); // personne.getPrenom()

personne{"prenom"} = "Harry"; // personne.setPrenom()

Personne personne = new Personne();personne.prenom = "Harry"; // personne.setPrenom("Harry")System.out.println(personne.prenom); // personne.getPrenom()

personne{"prenom"} = "Harry"; // personne.setPrenom()

List employes = entreprise.getEmployes();for(employe: employes)

System.out.println(employes.prenom + " " + employe.nom);

String [] noms = new String[] {"Thierry Chmonfils", "Yves Egé"}

List employes = entreprise.getEmployes();for(employe: employes)

System.out.println(employes.prenom + " " + employe.nom);

String [] noms = new String[] {"Thierry Chmonfils", "Yves Egé"}

Page 55: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 55

Les scripts beanshell 4/5

• Pour importer des classes: import, comme en Java– java.io, java.swing, java.net, java.util, sont

importés par défaut• Pour pouvoir placer des scripts dans un fichier

XML, vous pouvez utiliser une autre notation pour les opérateurs:– @gt >, @lt <, @lteq <=, @gteq >= …

• Vous pouvez définir des fonctions:

add(a, b) { return a + b);}

add(1, 2); // 3

add(a, b) { return a + b);}

add(1, 2); // 3

Page 56: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 56

Les scripts beanshell 5/5

• Vous pouvez définirdes objets– Comme en PHP,

attention, rien à voiravec Java

• Vous pouvez implémenter des interfaces avec BeanShell– ActionListener par exemple

foo() { int a = 42; bar() { print("The bar is open!"); } bar();return this;}fooObject = foo(); // prints "the bar is open!"print ( fooObject.a ) // 42fooObject.bar(); // prints "the bar is open!"

foo() { int a = 42; bar() { print("The bar is open!"); } bar();return this;}fooObject = foo(); // prints "the bar is open!"print ( fooObject.a ) // 42fooObject.bar(); // prints "the bar is open!"

Page 57: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 57

Evénement

ActionExpressionScriptEvénement

Page 58: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 58

Evénements

• Type de l'événement :– node-enter: un token rentre dans l'état– node-leave: un token quitte l'état– before-signal: déclenché au début de signal()– after-signal: déclenché à la fin de signal()

• Permet de déclencher des traitements:– <action>, <script>, <create-timer>, <cancel-

timer>

On verra plus tardOn verra plus tard

Page 59: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 59

Evénements et traitements

• Un événement peutdéclencher plusieursactions ou scripts

• Une action peut êtreutilisée par plusieursévénements

<state name="marie"> <event type="node-enter"> <action class="com.btc.EstMarie"/> <action class="com.btc.LogEvent"/> </event> <event type="node-leave"> <action class="com.btc.EstMarie"/> <script><expression> System.out.println("Bye bye love !"); </expression></script> </event> <event type="before-signal"> <action class="com.btc.LogEvent"/> </event> <event type="after-signal"> <action class="com.btc. LogEvent"/> </event></state>

<state name="marie"> <event type="node-enter"> <action class="com.btc.EstMarie"/> <action class="com.btc.LogEvent"/> </event> <event type="node-leave"> <action class="com.btc.EstMarie"/> <script><expression> System.out.println("Bye bye love !"); </expression></script> </event> <event type="before-signal"> <action class="com.btc.LogEvent"/> </event> <event type="after-signal"> <action class="com.btc. LogEvent"/> </event></state>

Page 60: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 60

Evénement globaux

• Définition d'événement sur le processus– Hérité par tous ses états

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="etat civil"> <event type="node-enter"> <script> <expression> System.out.println("ENTER NODE " + executionContext.getNode().getName()); </expression></script> </event> <start-state name="mineur"/> <transition name="a 18 ans" to="celibataire"/> </start-state> <state name="celibataire"> <transition name="mariage" to="marie"/> </state>…

<process-definition xmlns="urn:jbpm.org:jpdl-3.1" name="etat civil"> <event type="node-enter"> <script> <expression> System.out.println("ENTER NODE " + executionContext.getNode().getName()); </expression></script> </event> <start-state name="mineur"/> <transition name="a 18 ans" to="celibataire"/> </start-state> <state name="celibataire"> <transition name="mariage" to="marie"/> </state>…

Page 61: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 61

Evénements personnalisés

• Vous pouvez définir vos propres événements

• Pour déclencher l'événement:

Token token = …;token.getNode().fireEvent("monEvent", new ExecutionContext(token));outoken.getNode().fireAndPropagateEvent("monEvent", new ExecutionContext(token));

Token token = …;token.getNode().fireEvent("monEvent", new ExecutionContext(token));outoken.getNode().fireAndPropagateEvent("monEvent", new ExecutionContext(token));

<event type="monEvent"> <action class="com.btc.MonAction"/></event>

<event type="monEvent"> <action class="com.btc.MonAction"/></event>

L'événement est propagé sur les nœuds parents, comme le <process-definition>L'événement est propagé sur les nœuds parents, comme le <process-definition>

Page 62: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 62

Transition et traitement

• Vous pouvez associer un traitement lors du déclenchement de transitions:

• Vous pouvez déclarer:– <action>, <script>, <create-timer>, <cancel-

timer>

<state name="mineur"> <transition name="a 18 ans" to="celibataire"> <action class="com.btc.AutoriserLaDisco"/> <script><expression> System.out.println("yeeee"); </expression></script> </transition></state>

<state name="mineur"> <transition name="a 18 ans" to="celibataire"> <action class="com.btc.AutoriserLaDisco"/> <script><expression> System.out.println("yeeee"); </expression></script> </transition></state>

On verra plus tardOn verra plus tard

Page 63: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 63

Déclencher une transition

• Pour déclencher explicitement une transition dans une action:

• Pour déclencher la transition par défaut:

Token token = …;Transition transition = token.getNode().getLeavingTransition("maTransition");token.signal(transition);

ou

token.signal("maTransition");

Token token = …;Transition transition = token.getNode().getLeavingTransition("maTransition");token.signal(transition);

ou

token.signal("maTransition");

Token token = …;token.signal();Token token = …;token.signal();

Page 64: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 64

Travaux pratiques

• JBPM-Lab03-ActionScript-Question

Page 65: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Exceptions

Page 66: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 66

Exceptions

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 67: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 67

<exception-handler>

• Les traitements peuvent lever des exceptions:– Comment les traiter ?

• Complique souvent les processus

• Les exceptions peuvent être traitées par des <exception-handler>

<exception-handler class="com.btc.exceptions.NotFoundException"><action class="com.btc.process.TraiteException"/></exception-handler>

<exception-handler class="com.btc.exceptions.NotFoundException"><action class="com.btc.process.TraiteException"/></exception-handler>

Action déclenchée si une NotFoundException est levéeAction déclenchée si une NotFoundException est levée

Si pas spécifié, s'applique à toutes les exceptionsSi pas spécifié, s'applique à toutes les exceptions

Page 68: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 68

Implémenter un handler d'exceptions

• Un <exception-handler> peut être associé à:– Un processus de façon globale, un état, une

transition,– Une tâche ( nous verrons plus tard ce que c'est)

• L'action d'un <exception-handler> peut redéfinir l'état courant du Token:

public class ExceptionHandler implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { Node erreurNode = executionContext.getProcessDefinition().getNode("erreur"); executionContext.getToken().setNode(erreurNode); }}

public class ExceptionHandler implements ActionHandler { public void execute(ExecutionContext executionContext) throws Exception { Node erreurNode = executionContext.getProcessDefinition().getNode("erreur"); executionContext.getToken().setNode(erreurNode); }}

Page 69: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 69

Travaux Pratiques

• JBPM-Lab04-Exception-Question

Page 70: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Décision

Page 71: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 71

Decision

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 72: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 72

<decision> : deux types de décision

• Deux types de décisions:– Décision réalisé par le processus, dans sa

définition– Décision réalisé par une classe externe

• Décision réalisé par une classe externe– Une transition par choix– Déclencher la transition selon la

décision: signal("rejet") ousignal("accepte")

Page 73: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 73

<decision> : déclaration

• Décision dans le processus– Dans cet exemple, l'ajout d'une candidature est

rejetée si le CV existe déjà

<decision name="Verifier si le CV existe deja"> <handler class="com.btc.LeCvExisteDecision" config-type="bean"> <critere>Nom, Prenom</critere> </handler> <transition name="nouveau" to="cv entré"/> <transition name="existe deja" to="le cv existe deja"/></decision>

<decision name="Verifier si le CV existe deja"> <handler class="com.btc.LeCvExisteDecision" config-type="bean"> <critere>Nom, Prenom</critere> </handler> <transition name="nouveau" to="cv entré"/> <transition name="existe deja" to="le cv existe deja"/></decision>

Propriétés définies sur la

classe Java

Propriétés définies sur la

classe Java

Page 74: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 74

<decision> : DecisionHandler

• La décision est implémentée par une classe Java– Implémente l'interface DecisionHandler– Retourne le nom de la transition a déclencher

public class LeCvExisteDecision implements DecisionHandler { private String _critere;

public String decide(ExecutionContext executionContext) throws Exception { if( leCvExiste() ) return "existe deja"; else return "nouveau"; } … getCritere … setCritere … leCvExiste}

public class LeCvExisteDecision implements DecisionHandler { private String _critere;

public String decide(ExecutionContext executionContext) throws Exception { if( leCvExiste() ) return "existe deja"; else return "nouveau"; } … getCritere … setCritere … leCvExiste}

Les propriétés peuvent être définies dans la

description du processus

Les propriétés peuvent être définies dans la

description du processus

Page 75: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 75

<decision> : exécution

• Exemple des deux types denœud de décision:

ProcessInstance instance = new ProcessInstance(definition);

Token token = instance.getRootToken();

token.signal(); // Aller dans le nœud de décision

if( token.getNode().getName().equals("le cv existe deja") ) System.out.println("Le CV existe déjà");

else if( token.getNode().getName().equals("cv entré") ) { System.out.println("Le CV est entré"); instance.signal("accepte"); // aller dans le nœud attribuer bureau}

ProcessInstance instance = new ProcessInstance(definition);

Token token = instance.getRootToken();

token.signal(); // Aller dans le nœud de décision

if( token.getNode().getName().equals("le cv existe deja") ) System.out.println("Le CV existe déjà");

else if( token.getNode().getName().equals("cv entré") ) { System.out.println("Le CV est entré"); instance.signal("accepte"); // aller dans le nœud attribuer bureau}

Page 76: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 76

<condition>

• Vous pouvez ajouter sur les transitions sortantes d'un nœud de décision des conditions:

<decision name="autorisationAchat> <transition name="montant > 1000" to="validation acheteur">

<condition>![CDATA [ #{montant>1000]} ] </condition> </transition> <transition name="" to="passer la commande"/></decision>

<decision name="autorisationAchat> <transition name="montant > 1000" to="validation acheteur">

<condition>![CDATA [ #{montant>1000]} ] </condition> </transition> <transition name="" to="passer la commande"/></decision>

Si aucune condition n'est remplie, déclenchement

de la transition par défaut

Si aucune condition n'est remplie, déclenchement

de la transition par défaut

Page 77: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 77

Travaux Pratiques

• JBPM-Lab05-Decision-Question

Page 78: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Fork et Join

Page 79: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 79

Fork et Join

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 80: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 80

<fork> et <join> 1/2

• Fork: L'état du processus se divise en plusieurs états– Parallélisation– Création de nouveaux Token

• Join: Inverse du fork– Synchronisation– Déclenche automatiquement

les transitions entrantes– Une seule transition sortante

Page 81: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 81

<fork> et <join> 2/2

• Dans le fichier XML de description du processus:

<fork name="fork"> <transition name="demande telephone" to="installer telephone"/> <transition name="demande badge" to="fabriquer badge"/> <transition name="demande ordinateur" to="installer ordinateur"/></fork>

<state name="installer telephone"> <transition to="join"/></state>…<join name="join"> <transition name="" to="attente arrivee"/></join>

<fork name="fork"> <transition name="demande telephone" to="installer telephone"/> <transition name="demande badge" to="fabriquer badge"/> <transition name="demande ordinateur" to="installer ordinateur"/></fork>

<state name="installer telephone"> <transition to="join"/></state>…<join name="join"> <transition name="" to="attente arrivee"/></join>

Page 82: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 82

Tokens multiples

• L'état du processus est décrit par plusieurs tokens.

• Le rootToken ("Fork")• Un token par état fils

– Fork/installer téléphone– Fork/fabriquer badge– Fork/installer ordinateur

Token rootToken = processInstancet.getRootToken();Collection<Token> children = rootToken.getChildren();for(Token child: children) System.out.println(child.getNode().getName());

Token rootToken = processInstancet.getRootToken();Collection<Token> children = rootToken.getChildren();for(Token child: children) System.out.println(child.getNode().getName());

Page 83: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 83

Travaux Pratiques

• JBPM-Lab06-ForkJoin

Page 84: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Tâches

Page 85: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 85

Tâche

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 86: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 86

• Task: une tâche humaine est en cours de réalisation– Attention, ce n'est pas une tâche informatique !

• Une tâche est créée, affectée démarrée,terminée.– Les tâches terminées ne sont

pas détruites de la base– Il faut les purger par un batch

de temps en temps.• L'affectation et le démarrage peut être

contrôlé par jBPM ou par votre code Java

Tâche

Non affectéeNon affectée

AffectéeAffectée

DémarréeDémarrée

TerminéeTerminée

AnnuléeAnnulée

SuspendueSuspendue

Page 87: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 87

Affectation

• Les tâches sont affectées à un ou plusieurs acteurs– Affectation d'une tâche = assignment– Attention, un acteur est un rôle, pas une

personne• Affectation dans la définition du processus ou

dans votre code Java• jBPM gère des listes de tâches devant être

réalisées pour chaque acteur– Tasklist ou Todolist

Page 88: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 88

<task-node> 1/3

• Etat exécutant une ou plusieurs tâches– Passe à l'état suivant selon l'état de ses tâches– Les tâches démarrent lorsque le Token arrive dans

l'état– La fin des tâches est signalée par l'utilisateur

<task-node name="installation"> <task name="Installer telephone"> <assignment actorId="ResponsableInstallationTelephone"/> </task> <task name="FabriquerBadge"> <assignment actorId="ResponsabelBadge"/> </task> <transition to="suivant"/><task-node>

<task-node name="installation"> <task name="Installer telephone"> <assignment actorId="ResponsableInstallationTelephone"/> </task> <task name="FabriquerBadge"> <assignment actorId="ResponsabelBadge"/> </task> <transition to="suivant"/><task-node>

Sera déclenchée lorsque les deux tâches seront terminéesSera déclenchée lorsque les deux tâches seront terminées

Page 89: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 89

<task-node> 2/3

• Le déclenchement de la transition peut être contrôlé par l'attribut <task-node signal="…"/>– last: lorsque toutes les tâches sont terminées, si

aucune tâche n'est créé, passe à l'état suivant– last-wait: idem, mais si aucune tâche n'est

créée, attends que des tâches soient créées,– first: dès qu'une tâche est terminée , si aucune

tâche n'est créé, passe à l'état suivant– first-wait: idem, mais si aucune tâche n'est

créée, attends que des tâches soient créées,SuiteSuite

Page 90: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 90

<task-node> 3/3

– unsynchronized: continue l'exécution, n'attends ni la création ni la fin des tâches,

– never: l'exécution ne continue jamais, le processus reste dans cet état.

• Les tâches ont un nom– Pour être référencé dans le code Java– Ce nom doit être unique pour un processus

SuiteSuite

Page 91: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 91

<task>

• <task> décrit une tâche• duedate: durée maximale

– Une simple donnée, pasd'avertissement en cas dedépassement (voir timer).

• blocking– true: reste dans l'état si cette tâche n'est pas

terminée, même si signal est appelé sur le nœud, – [false]: si le nœud reçoit un signal, il ne tient pas

compte de cette tâche et passe à l'état suivant• priority: highest, high, normal, low, lowest

<task-node name="Préparer"> <task name="InstallaterOrdinateur"/> <task name="CréerLeBadge"/> <task name="InstallerTelephone"/></task-node>

<task-node name="Préparer"> <task name="InstallaterOrdinateur"/> <task name="CréerLeBadge"/> <task name="InstallerTelephone"/></task-node>

Page 92: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 92

Création des tâches avec Java

• Vous pouvez contrôler la création des tâches

<task-node create-tasks="false"> <task name="InstallationPC"> <event type="node-enter> <action class="com.btc.CreateTasks"/> </event> </task></task-node>

<task-node create-tasks="false"> <task name="InstallationPC"> <event type="node-enter> <action class="com.btc.CreateTasks"/> </event> </task></task-node>

public class CreateTasks implements ActionHandler { public void execute( ExecutionContext executionContext) throws Exception { Token token = executionContext.getToken();

TaskNode taskNode = (TaskNode) executionContext.getNode(); Task installerTelephone = taskNode.getTask("Installer telephone"); TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); tmi.createTaskInstance(installerTelephone , token); }}

public class CreateTasks implements ActionHandler { public void execute( ExecutionContext executionContext) throws Exception { Token token = executionContext.getToken();

TaskNode taskNode = (TaskNode) executionContext.getNode(); Task installerTelephone = taskNode.getTask("Installer telephone"); TaskMgmtInstance tmi = executionContext.getTaskMgmtInstance(); tmi.createTaskInstance(installerTelephone , token); }}

Nous verrons l'API plus en détails plus loinNous verrons l'API plus en détails plus loin

Page 93: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 93

Identity 1/3

• Pour gérer l'affectation des tâches, jBPM doit connaître les utilisateurs– Ces données sont généralement spécifiques à

chaque application ou organisation• Ces données sont gérées par jBPM dans un

package spécifique– identity

• jBPM n'a aucune dépendance vers identity– Seul l'id des acteurs passe entre les packages

Page 94: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 94

Identity 2/3

• Le modèle du package identity est simple– User: un utilisateur (id, name, email, password)– Group: groupe d'utilisateur (équipe, service,

département, division, entreprise…)– Un User peut appartenir à plusieurs Group

Page 95: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 95

Identity 3/3

• Ce modèle n'est pas orienté rôle, mais utilisateur

• Cependant, vous pouvez fournir une implémentation spécifique de identity sur vos données– jBPM ne connaît pas le package identity– Seul l'id des acteurs passent (String)

Page 96: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 96

Affectation à un acteur et un pool d'acteurs

• Permet d'affecter une tâche à:– Un acteur– Un groupe d'acteurs Pooled actors pouvant être

affectés à cette tâche. Peut également contenir des groupes.

• jBPM permet de récupérer la liste– Des tâches affectées à un utilisateur– Des tâches dans lesquelles l'utilisateur est pressenti

• Si un acteur est affecté à une tâche ayant un pooled-actor, la tâche disparaît de la liste des tâches candidates des autres utilisateurs.

Page 97: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 97

Affectation statique

• L'affectation a lieu immédiatement après la création de la tâche.

• Affectation à un acteur:

• Affectation à un groupe d'acteurs:

<task> <assignment actor-id="ResponsableAchat"/></task>

<task> <assignment actor-id="ResponsableAchat"/></task>

<task> <assignment pooled-actors="InstallateurPC,ConfigurateurPC"/></task>

<task> <assignment pooled-actors="InstallateurPC,ConfigurateurPC"/></task>

Page 98: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 98

Swimlane

• Un swinmlane définit un rôle dans le processus.

• Ce rôle est local et est affecté à un acteur– Indirection

• Une tâche peut être affectée à une swimlane– Vous affectez la swimlane à un acteur<process-definition name="recrutement">

<swimlane name='bricoleur'> <assignment actor-id="Gérard Mensoif "/> </swimlane>

<task-node name="Installation du PC"> <task name="Installer le pc" swimlane="bricoleur"/> </task-node></process-definition>

<process-definition name="recrutement"> <swimlane name='bricoleur'> <assignment actor-id="Gérard Mensoif "/> </swimlane>

<task-node name="Installation du PC"> <task name="Installer le pc" swimlane="bricoleur"/> </task-node></process-definition>

Ne peut pas contenir un assignment, car affecté à une swimlane

Ne peut pas contenir un assignment, car affecté à une swimlane

Page 99: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 99

Affectation dynamique par expression

• Les attributs actor et pooled-actors peuvent contenir une expression EL

• Affectation dans une action Java

<task> <assignment actor-id="#{ResponsableAchat}"/></task>

<task> <assignment actor-id="#{ResponsableAchat}"/></task>

public void execute(ExecutionContext executionContext) { TaskInstance taskInstance = …; taskInstance.assign(executionContext); ou taskInstance.setActorId("Romeo Frigoskeutapri");}

public void execute(ExecutionContext executionContext) { TaskInstance taskInstance = …; taskInstance.assign(executionContext); ou taskInstance.setActorId("Romeo Frigoskeutapri");}

Déclenche l'affectation de la tâche définie dans le processus

Déclenche l'affectation de la tâche définie dans le processus

Page 100: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 100

Affectation dynamique avec Java

• Déclarez une classe implémentant l'interface AssignmentHandler:

• Un Assignable peut être une TaskInstance ou une Swimlane

public class AssignTask implements AssignmentHandler { public void assign(Assignable assignable, ExecutionContext executionContext) { assignable.setActorId("Camille Onciterne"); }}

public class AssignTask implements AssignmentHandler { public void assign(Assignable assignable, ExecutionContext executionContext) { assignable.setActorId("Camille Onciterne"); }}

Page 101: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 101

<controller> 1/2

• Un contrôleur permet à une tâche d'utiliser des variables globales localement

• Le contrôleur se charge de:– Copier la valeur de la variable au démarrage de la

tâche– Copier la valeur dans le contexte global à la fin.

<task name="tache"> <controller> <variable name="a" access="read" mapped-name="x" /> <variable name="b" access="read,write,required" mapped-name="y" /> <variable name="c" access="read,write" /> </controller></task>

<task name="tache"> <controller> <variable name="a" access="read" mapped-name="x" /> <variable name="b" access="read,write,required" mapped-name="y" /> <variable name="c" access="read,write" /> </controller></task>

Variables dans le contexte du processus

Variables dans le contexte du processus

Mode d'accès par la tâcheMode d'accès par la tâche

Variables dans le contexte de la tâcheVariables dans le contexte de la tâche

Page 102: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 102

<controller> 2/2

• Vous pouvez écrire votre propre contrôleur– Classe qui implémente TaskControllerHandler

• Utilisez l'attribut class de la balise <controller>

public interface TaskControllerHandler extends Serializable { void initializeTaskVariables(TaskInstance ti, ContextInstance ci, Token t); void submitTaskVariables(TaskInstance ti, ContextInstance ci, Token t);}

public interface TaskControllerHandler extends Serializable { void initializeTaskVariables(TaskInstance ti, ContextInstance ci, Token t); void submitTaskVariables(TaskInstance ti, ContextInstance ci, Token t);}

<task name="clean ceiling"> <controller class="com.btc.MonController"> -- Vous pouvez ajouter des paramètres ici -- </controller> </task>

<task name="clean ceiling"> <controller class="com.btc.MonController"> -- Vous pouvez ajouter des paramètres ici -- </controller> </task>

Page 103: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 103

API de manipulation des tâches

• TaskMgmtInstance– Lié au processInstance– Permet principalement de créer des Tâches

• TaskMgmtSession– Lié au JbpmContext– Permet de récupérer les tâches par acteur

• TaskInstance représente une tâche en cours

executionContext.getTaskMgmtInstance();executionContext.getTaskMgmtInstance();

jbpmContext.getTaskMgmtSession();jbpmContext.getTaskMgmtSession();

List<TaskInstance> tasks = findTaskInstances(String actorId);List<TaskInstance> pooledTasks = findPooledTaskInstances(String actorId);List<TaskInstance> tasks = findTaskInstances(String actorId);List<TaskInstance> pooledTasks = findPooledTaskInstances(String actorId);

Page 104: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 104

Travaux Pratiques

• JBPM-Lab07-Task-Question

Page 105: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Timer

Page 106: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 106

Timer

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 107: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 107

Timer

• Permet d'exprimer la durée maximale d'attente dans un état– Durée absolue: 2 seconds, 2 minutes, 2 houres, 2

days, 2 weeks, 2 years– Durée travaillée: 2 business days, 40 business

houres…• Utilise un calendrier définissant les week-

ends, les horaires, les vacances– Voir dans jbpm.cfg.xml– Class BusinessCalendar

Page 108: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 108

Gérer les Timers

• Exemple: création d'un timer lors de l'entrée dans l'état AttendreBadge

<state name="attendre badge"> <event name="node-enter"> <create-timer name="timer" duedate="3 business days" transition="escalade"/> <action class="com.btc.DemanderBadge"/> </event> <event name="node-leave"> <cancel-timer name="timer"/> </event> <transition name="badge fait" to="badge fait"/> <transition name="escalade" to="timeout"> <action class="com.btc.Alerter"/> </transition></state>

<state name="attendre badge"> <event name="node-enter"> <create-timer name="timer" duedate="3 business days" transition="escalade"/> <action class="com.btc.DemanderBadge"/> </event> <event name="node-leave"> <cancel-timer name="timer"/> </event> <transition name="badge fait" to="badge fait"/> <transition name="escalade" to="timeout"> <action class="com.btc.Alerter"/> </transition></state>

Page 109: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 109

Timers associés à un état

• Il est plus simple dans ce cas d'utiliser la balise <timer> sur l'état:

<state name="attendre badge"> <timer duedate="3 business days" repeat="true"> <script><expression> if( nbessais == void ) nbessais = 0; else nbessais++; if(nbessais < 3) sendEmail("[email protected]", "Tu es en retard !"); else signal("escalader"); </expression></script> </timer> <transition name="escalader" to="alerter le boss de harry"/></state>

<state name="attendre badge"> <timer duedate="3 business days" repeat="true"> <script><expression> if( nbessais == void ) nbessais = 0; else nbessais++; if(nbessais < 3) sendEmail("[email protected]", "Tu es en retard !"); else signal("escalader"); </expression></script> </timer> <transition name="escalader" to="alerter le boss de harry"/></state>

Page 110: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 110

Déclenchement des Timers

• Les timers sont déclenchés dans des Threads,• Dans une application Web vous devez déclarer

une servlet,• Dans une application Java, il faut lancer le

scheduler• Tâche ant pour lancer le scheduler

<target name="run scheduler"> <java classname="com.btc.scheduler.SchedulerMain" classpathref="classpath.build"/></target>

<target name="run scheduler"> <java classname="com.btc.scheduler.SchedulerMain" classpathref="classpath.build"/></target>

Page 111: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 111

Travaux Pratiques

• JBPM-Lab08-Timer-Question

Page 112: Présentation de jBPM 3.1

Th

ibau

lt C

uvillier

– C

reati

ve C

om

mon

s 2

.0

WS 1.0 - Template 1.0

jBPM

Avancé

Page 113: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 113

Avancé

Survol de jBPMGraphe et ContexteProcessus, Etats et TransitionsActions, Scripts et EvénementsExceptionsDecisionFork et JoinTaskTimerAvancé

Page 114: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 114

Super états 1/2

• Vous pouvez définir un super-état groupant des sous états.

• Les transitions sortantes du super-état sont héritées par les sous états.

• Les transitions entrantes arrivent sur le premier sous état.

• Des transitions peuvent entrer directement dans un sous état.

Super-étatSuper-étatSous état 1Sous état 1Sous état 2Sous état 2Etat1Etat1

Etat2Etat2

Etat3Etat3trtr

Page 115: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 115

Super-état 2/2

• Les événements et exception-handler du super-état sont hérités par les sous états

• Evénements:– superstate-enter– superstate-leave

• Un token est créé pour le super-état.– /super état/sous état 1

<start-state name="état 1"> <transition to="super état"/></start-state>

<super-state name="super état> <state name="sous état 1"> <transition to="sous état 2"/> </state>

<state name="sous état 2"> <transition to="état2"/> </state> <transition name="tr" to="état3"/></super-state><end-state name="état 2"/><end-state name="état 3"/>

<start-state name="état 1"> <transition to="super état"/></start-state>

<super-state name="super état> <state name="sous état 1"> <transition to="sous état 2"/> </state>

<state name="sous état 2"> <transition to="état2"/> </state> <transition name="tr" to="état3"/></super-state><end-state name="état 2"/><end-state name="état 3"/>

Page 116: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 116

Sous processus 1/2

• Un état peut contenir un autre processus– Un processus peut en déclencher un autre– <process-state>

• Lorsque le sous processus se termine (end-state):– Déclenchement de la transition par défaut

<start-state name="debut"> <transition to="achat d'un PC"/></start-state><process-state name="achat d'un PC"> <sub-process name="achat"/> <transition to="installer PC"/></process-state><start-state name="installer PC"/>

<start-state name="debut"> <transition to="achat d'un PC"/></start-state><process-state name="achat d'un PC"> <sub-process name="achat"/> <transition to="installer PC"/></process-state><start-state name="installer PC"/>

Page 117: Présentation de jBPM 3.1

Business Technology Consultinghttp://www.btcweb.com Développer des Services WebThibault Cuvillier

Creative Commons jBPM / Survol 117

Sous processus 2/2

• Vous pouvez mapper des variables du processus dans le sous processus– Décrivez le mode d'accès: lecture, écriture

• Remarque:– Le sous processus possédera un Token

indépendant

<process-state name="achat d'un PC"> <sub-process name="achat"/> <variable name="quoi" access="read" mapped-name="que-acheter"/> <variable name="prix" access="write" mapped-name="cout"/> <transition to="installer PC"/></process-state>

<process-state name="achat d'un PC"> <sub-process name="achat"/> <variable name="quoi" access="read" mapped-name="que-acheter"/> <variable name="prix" access="write" mapped-name="cout"/> <transition to="installer PC"/></process-state>