2. Thibault Cuvillier – Creative Commons 2.0
Survol de jBPM
Un premier exemple avec jBPM
WS 1.0 - Template 1.0
3. Survol de jBPM
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
3
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
4
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 lors
du déclenchement d'une
transition
– Un acquittement par un utilisateur
– Un acquittement informatique
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
5
6. jBPM est une API Java
• Ce que n'est pas jBPM:
– Pas de serveur à lancer
SOAP
IIOP
JMS
• Ce qu'est jBPM:
– Une API
– Application Java, Web ou EJB
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
API Java
Développer desSurvol
jBPM / Services Web
6
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>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
7
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());
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
8
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.
Nous verrons plus loin
JpbmProcessDefinition definition = …;
JbpmConfiguration configuration = …;
JbpmContext jbpmContext = configuration.createJbpmContext();
context.deployProcessDefinition(definition);
GraphSession graphSession = jbpmContext.getGraphSession();
ProcessDefinition definition = graphSession.findLatestProcessDefinition("hello world");
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
9
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>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
10
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 !");
}
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
11
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 !");
…
public class AfficherHello implements ActionHandler {
public void execute(ExecutionContext executionContext) throws Exception {
String msg = (String)executionContext.getContextInstance().getVariable("hello");
System.out.println("============> " + msg);
}
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
12
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
13
15. Graphe et Contexte
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
15
16. Graphe 1/2
• jBPM est basé sur un modèle de graphe
générique
– Dans org.jbpm.graph
Action
*
Event
ProcessDefinition
*
1
class
GraphElement
*
Node
1
1
initiale
finale
* ExceptionHandler
sortante
entrante
*
*
Transition
• Un GraphElement contient:
– Des Event permettant de déclencher des actions,
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
16
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.graph
service
service
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
service
Par exemple:
gestion des tâches
gestion de la persistance
gestion de la messagerie
…
Développer desSurvol
jBPM / Services Web
17
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
JbpmConfiguration configuration = JbpmConfiguration.getInstance();
JbpmContext jbpmContext = configuration.createJbpmContext();
• Tous les services sont créé par des factories
– Peuvent être redéfinies
– jBPM est très extensible
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
18
19. Les sous contextes de JbpmContext
JbpmContext
• 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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
GraphSession
LoggingSession
MessagingSession
SchedulerSession
TaskMgmtSession
Développer desSurvol
jBPM / Services Web
19
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é
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
20
25. Définition d'un processus
• Dans un fichier XML
– Schéma spécifique JBoss
– Support de BPEL (Business Process Execution
Language)
<?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>
• La description du processus devra être déployé
dans la base de données
– Dans une nouvelle version Développer desSurvol Web
du processus
jBPM / Services
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
25
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
Not started
– Lors de l'utilisation de sous-processus
– Nous verrons ces points
Suspended
Started
plus loin
TerminatedImplicitly
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
End-state
26
27. Manipulation des définitions de processus
• Chargement de la définition d'un processus
ProcessDefinition definition = ProcessDefinition.parseXmlResource("processus.xml");
• Chargement dans la base d'un processus
jbpmContext.deployProcessDefinition(definition);
• Liste de toutes les version d'un processus
List<ProcessDefinition> graphSession.findAllProcessDefinitionVersions("recrutement");
• Récupérer la dernière version d'un processus
ProcessDefinition graphSession.findLatestProcessDefinition();
• Destruction d'un processus
graphSession. deleteProcessDefinition(processDefinition);
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
27
28. Manipulation des instances de processus
• Lecture des instances d'un processus
List<ProcessInstance> graphSession.findProcessInstances(long processDefinitionId)
• Création d'une nouvelle instance d'un processus
ProcessInstance jbpmContext.newProcessInstances(Stirng processName)
• Destruction d'une instance de processus
graphSession.deleteProcessInstance(long processInstanceId)
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
28
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
fonctionner
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
29
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();
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
30
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
31
32. Save
• Méthode
save
JbpmContext jbpmContext = configuration.createJbpmContext();
try {
Après cette ligne, il
ne faut plus utiliser
processInstance
ProcessInstance processInstance =
jbpmContext.loadProcessInstance(id);
processInstance.signal();
jbpmContext.save(processInstance);
} catch(Exception e) {
jbpmContext.setRollbackOnly();
} finally {
Commit ou rollback de
jbpmContext.close();
la transaction
}
• Si vous utilisez loadXxxForUpdate, pas la peine
d'appeler save()
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
32
33. Token
Token token = processInstance.getRootToken();
• Un token contient la
référence sur l'état courant
– L'état courant est un nœud
Node node = token.getNode();
• Pour récupérer l'état courant:
– Conversion en StartState, EndState, State …
• Pour changer d'état dans le code
Node node = processDefinition.getNode("etat");
– Ne s'utilise que pour
token.setNode(node);
traiter les erreurs
• Un processus peut avoir plusieurs états courants
– Split, merge
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
33
34. Etat et transition
Processus
Etat et Transition
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
34
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
35
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
36
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
37
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"/>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
38
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.
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
44
45. Action
• Définition d'une action sur réception d'un
événement (nous verrons les événements + loin):
processDefinition.xml
<state name="Hello">
<event type="node-enter">
<action class="com.btc.FaitCaAction"/>
</event>
</state>
• Une action implémente l'interface ActionHandler
FaitCaAction.java
public class FaitCaAction implements ActionHandler {
public void execute(ExecutionContext executionContext) throws Exception {
…
}
Nous verrons plus tard cette classe
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
45
46. Configuration d'une action 1/2
• Une action est une classe Java qui implémente
l'interface ActionHandler
AfficherAction.java
public class FaitCaAction implements ActionHandler {
private String _message;
public void execute(ExecutionContext executionContext) throws Exception {
System.out.println(_message);
}
… getMessage … setMessage …
}
• Une action peut avoir des propriétés
processDefinition.xml
<action class="com.btc.AfficherAction" config-type="bean">
<message>Hello World !</message>
Valeur de
</action>
propriété
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
46
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)
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
47
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());
Définition de
la variable
Référence à
la méthode
<event type="node-enter">
<action name="AfficheHello" expression="#{monAction.maMethode}"/>
</event>
EL est utilisable pour de nombreux attributs du fichier XML
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
49
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
50
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 <event type="node-enter">
<script>
<expression>
– Script java, sera
for(int i = 0; i < 10; i++)
intégré dans J2SE
System.out.println(m);
</expression>
<variable name="message"
access="read" mapped-name="m"/>
</script>
</event>
• <value> map
une valeur du contexte sur une variable de script
• Object implicite: executionContext
– Nous verrons cette classe plus loin
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
52
53. Les scripts beanshell 2/5
• Syntaxe très proche de Java:
double foo = 0.34;
bar = Math.sin(foo)
StringBuffer sb = new StringBuffer();
sb.append("Hello");
Les variables sont
ou non typées
JFrame frame = new JFrame("Hello World !");
frame.setVisible(true);
for(int i = 0; i < 10 i++)
System.out.println("Hello World !");
• Vous pouvez utiliser toutes les classes Java
– Les classes de J2SE
– Vos classes
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
53
54. Les scripts beanshell 3/5
• BeanShell comporte des raccourcis:
Personne personne = new Personne();
personne.prenom = "Harry";
System.out.println(personne.prenom);
// personne.setPrenom("Harry")
// personne.getPrenom()
personne{"prenom"} = "Harry";
// personne.setPrenom()
• Vous pouvez manipuler collections et tableaux:
List employes = entreprise.getEmployes();
for(employe: employes)
System.out.println(employes.prenom + " " + employe.nom);
String [] noms = new String[] {"Thierry Chmonfils", "Yves Egé"}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
54
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 >= … add(a, b) {
• Vous pouvez définir des fonctions:
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
}
return a + b);
add(1, 2);
Développer desSurvol
jBPM / Services Web
// 3
55
56. Les scripts beanshell 5/5
• Vous pouvez définir
des objets
– Comme en PHP,
attention, rien à voir
avec Java
foo() {
int a = 42;
bar() {
print("The bar is open!");
} bar();
return this;
}
fooObject = foo(); // prints "the bar is open!"
print ( fooObject.a ) // 42
fooObject.bar(); // prints "the bar is open!"
• Vous pouvez implémenter des interfaces avec
BeanShell
– ActionListener par exemple
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
56
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 tard
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
58
59. Evénements et traitements
• Un événement peut
déclencher plusieurs
actions ou scripts
• Une action peut être
utilisée par plusieurs
événements
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
<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>
Développer desSurvol
jBPM / Services Web
59
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>
…
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
60
61. Evénements personnalisés
• Vous pouvez définir vos propres événements
<event type="monEvent">
<action class="com.btc.MonAction"/>
</event>
• Pour déclencher l'événement:
Token token = …;
token.getNode().fireEvent("monEvent", new ExecutionContext(token));
ou
token.getNode().fireAndPropagateEvent("monEvent", new ExecutionContext(token));
L'événement est propagé sur les nœuds
parents, comme le <process-definition>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
61
62. Transition et traitement
• Vous pouvez associer un traitement lors du
déclenchement de transitions:
<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 tard
• Vous pouvez déclarer:
– <action>, <script>, <create-timer>, <cancel-timer>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
62
63. Déclencher une transition
• Pour déclencher explicitement une transition dans
une action:
Token token = …;
Transition transition = token.getNode().getLeavingTransition("maTransition");
token.signal(transition);
ou
token.signal("maTransition");
• Pour déclencher la transition par défaut:
Token token = …;
token.signal();
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
63
66. Exceptions
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
66
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>
Si pas spécifié, s'applique à
toutes les exceptions
<exception-handler class="com.btc.exceptions.NotFoundException">
<action class="com.btc.process.TraiteException"/>
</exception-handler>
Action déclenchée si une
NotFoundException est levée
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
67
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);
}
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
68
71. Decision
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
71
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") ou
signal("accepte")
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
72
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>
Propriétés définies
</handler>
sur la classe Java
<transition name="nouveau" to="cv entré"/>
<transition name="existe deja" to="le cv existe deja"/>
</decision>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
73
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";
Les propriétés peuvent être
else
définies dans la description
return "nouveau";
du processus
}
… getCritere … setCritere … leCvExiste
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
74
75. <decision> : exécution
• Exemple des deux types de
nœ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
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
75
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>
Si aucune condition n'est
remplie, déclenchement de
la transition par défaut
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
76
79. Fork et Join
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
79
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
80
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>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
81
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());
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
82
85. Tâche
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
85
86. Tâche
• Task: une tâche humaine est en cours de
réalisation
– Attention, ce n'est pas une tâche informatique !
Non affectée
• Une tâche est créée, affectée démarrée,
terminée.
Annulée
Affectée
– Les tâches terminées ne sont
pas détruites de la base
Démarrée
Suspendue
– Il faut les purger par un batch
Terminée
de temps en temps.
• L'affectation et le démarrage peut être
contrôlé par jBPM ou par votre code Java
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
86
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
87
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>
Sera déclenchée lorsque les deux
<transition to="suivant"/>
tâches seront terminées
<task-node>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
88
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,
Suite
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
89
90. <task-node> 3/3
Suite
– 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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
90
91. <task>
• <task> décrit une tâche
• duedate: durée maximale <task-node name="Préparer">
<task name="InstallaterOrdinateur"/>
– Une simple donnée, pas
<task name="CréerLeBadge"/>
<task name="InstallerTelephone"/>
d'avertissement en cas de
</task-node>
dé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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
91
92. Création des tâches avec Java
• Vous pouvez contrôler la création des tâches
Nous verrons l'API plus en
<task-node create-tasks="false">
détails plus loin
<task name="InstallationPC">
<event type="node-enter>
<action class="com.btc.CreateTasks"/>
</event>
public class CreateTasks implements ActionHandler {
</task>
public void execute(
</task-node>
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);
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
92
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
93
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
94
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)
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
95
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.
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
96
97. Affectation statique
• L'affectation a lieu immédiatement après la
création de la tâche.
• Affectation à un acteur:
<task>
<assignment actor-id="ResponsableAchat"/>
</task>
• Affectation à un groupe d'acteurs:
<task>
<assignment pooled-actors="InstallateurPC,ConfigurateurPC"/>
</task>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
97
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>
Ne peut pas contenir un
assignment, car affecté à
une swimlane
<task-node name="Installation du PC">
<task name="Installer le pc" swimlane="bricoleur"/>
</task-node>
</process-definition>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
98
99. Affectation dynamique par expression
• Les attributs actor et pooled-actors peuvent
contenir une expression EL
<task>
<assignment actor-id="#{ResponsableAchat}"/>
</task>
• Affectation dans une action Java
public void execute(ExecutionContext executionContext) {
TaskInstance taskInstance = …;
taskInstance.assign(executionContext);
ou
taskInstance.setActorId("Romeo Frigoskeutapri");
}
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Déclenche l'affectation
de la tâche définie dans
le processus
Développer desSurvol
jBPM / Services Web
99
100. Affectation dynamique avec Java
• Déclarez une classe implémentant l'interface
AssignmentHandler:
public class AssignTask implements AssignmentHandler {
public void assign(Assignable assignable, ExecutionContext executionContext) {
assignable.setActorId("Camille Onciterne");
}
}
• Un Assignable peut être une TaskInstance ou une
Swimlane
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
100
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.
Variables dans
le contexte du
processus
Mode d'accès par
la tâche
<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" />
Variables dans le
</controller>
contexte de la tâche
</task>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
101
102. <controller> 2/2
• Vous pouvez écrire votre propre contrôleur
– Classe qui implémente TaskControllerHandler
public interface TaskControllerHandler extends Serializable {
void initializeTaskVariables(TaskInstance ti, ContextInstance ci, Token t);
void submitTaskVariables(TaskInstance ti, ContextInstance ci, Token t);
}
• Utilisez l'attribut class de la balise <controller>
<task name="clean ceiling">
<controller class="com.btc.MonController">
-- Vous pouvez ajouter des paramètres ici -</controller>
</task>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
102
103. API de manipulation des tâches
executionContext.getTaskMgmtInstance();
• TaskMgmtInstance
– Lié au processInstance
– Permet principalement de créer des Tâches
• TaskMgmtSession
jbpmContext.getTaskMgmtSession();
– Lié au JbpmContext
– Permet de récupérer les tâches par acteur
List<TaskInstance> tasks = findTaskInstances(String actorId);
List<TaskInstance> pooledTasks = findPooledTaskInstances(String actorId);
• TaskInstance représente une tâche en cours
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
103
106. Timer
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
106
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
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
107
108. Gérer les Timers
• Exemple: création d'un timer lors de l'entrée dans
name="attendre badge">
l'état AttendreBadge
t name="node-enter">
ate-timer name="timer" duedate="3 business days" transition="e
on class="com.btc.DemanderBadge"/>
nt>
name="node-leave">
cel-timer name="timer"/>
nt>
ition name="badge fait" to="badge fait"/>
ition name="escalade" to="timeout">
on class="com.btc.Alerter"/>
sition>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
108
109. Timers associés à un état
<state name="attendre cas d'utiliser la balise
• Il est plus simple dans ce badge">
<timer><timer duedate="3 business days" repeat="true">
sur l'état:
<script><expression>
if( nbessais == void )
nbessais = 0;
else
nbessais++;
if(nbessais < 3)
sendEmail("harry@btcweb.com", "Tu es en reta
else
signal("escalader");
</expression></script>
</timer>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
109
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
me="run scheduler">
sname="com.btc.scheduler.SchedulerMain"
ssname="com.btc.scheduler.SchedulerMain" classpathref="class
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
110
113. Avancé
Survol de jBPM
Graphe et Contexte
Processus, Etats et Transitions
Actions, Scripts et Evénements
Exceptions
Decision
Fork et Join
Task
Timer
Avancé
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
113
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.
Etat1
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Super-état
Sous état Sous état 2
1 ous
S
Etat2
tr
Développer desSurvol
jBPM / Services Web
Etat3
114
115. Super-état 2/2
• Les événements et
<start-state name="état 1">
exception-handler du
<transition to="super état"/>
super-état sont hérités
</start-state>
par les sous états
• Evénements:
<super-state name="super état>
– superstate-enter
<state name="sous état 1">
<transition to="sous état 2"/>
– superstate-leave
• Un token est créé pour </state>
le super-état.
<state name="sous état 2">
– /super état/sous état 1
<transition to="état2"/>
</state>
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
115
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"/>Web
Développer desSurvol
jBPM Services
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
116
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
ocess-state name="achat d'un PC">
ub-process name="achat"/>
ariable name="quoi" access="read" mapped-name="que-achete
ariable name="prix" access="write" mapped-name="cout"/>
ransition to="installer PC"/>
ocess-state>
rocess-state>
• Remarque:
– Le sous processus possédera un Token indépendant
Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons
Développer desSurvol
jBPM / Services Web
117