SlideShare une entreprise Scribd logo
1  sur  117
Copyleft Thibault Cuvillier

jBPM 3.1

Thibault Cuvillier
Jav@rchitecte
Consultant indépendant
cuvillier@gmail.com
www.btcweb.com
WS 1.0 - Template 1.0
Thibault Cuvillier – Creative Commons 2.0

Survol de jBPM

Un premier exemple avec jBPM

WS 1.0 - Template 1.0
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
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
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
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
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
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
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
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
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
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
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
Thibault Cuvillier – Creative Commons 2.0

jBPM

Graphe et Contexte

WS 1.0 - Template 1.0
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
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
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
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
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
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
Travaux pratique
• JBPM-Lab01-Context-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

21
Thibault Cuvillier – Creative Commons 2.0

jBPM

Processus, Etat et Transition

WS 1.0 - Template 1.0
Processus, Etat et Transition
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

23
Processus
Processus
Etat et Transition

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

24
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
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
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
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
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
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
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
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
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
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
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
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
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
<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
<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"/>

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

39
Travaux pratiques
• JBPM-Lab02-Question-Processus

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

40
Thibault Cuvillier – Creative Commons 2.0

jBPM

Action, Script et Evénements

WS 1.0 - Template 1.0
Processus, Etat et Transition
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

42
Action
Action
Expression
Script
Evénement

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

43
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
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
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
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
Expression
Action
Expression
Script
Evénement

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

48
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
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
Script
Action
Expression
Script
Evénement

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

51
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
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
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
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
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
Evénement
Action
Expression
Script
Evénement

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

57
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
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
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
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
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
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
Travaux pratiques
• JBPM-Lab03-ActionScript-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

64
Thibault Cuvillier – Creative Commons 2.0

jBPM

Exceptions

WS 1.0 - Template 1.0
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
<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
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
Travaux Pratiques
• JBPM-Lab04-Exception-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

69
Thibault Cuvillier – Creative Commons 2.0

jBPM

Décision

WS 1.0 - Template 1.0
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
<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
<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
<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
<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
<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
Travaux Pratiques
• JBPM-Lab05-Decision-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

77
Thibault Cuvillier – Creative Commons 2.0

jBPM

Fork et Join

WS 1.0 - Template 1.0
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
<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
<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
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
Travaux Pratiques
• JBPM-Lab06-ForkJoin

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

83
Thibault Cuvillier – Creative Commons 2.0

jBPM

Tâches

WS 1.0 - Template 1.0
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
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
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
<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
<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
<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
<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
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
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
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
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
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
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
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
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
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
<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
<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
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
Travaux Pratiques
• JBPM-Lab07-Task-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

104
Thibault Cuvillier – Creative Commons 2.0

jBPM

Timer

WS 1.0 - Template 1.0
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
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
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
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
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
Travaux Pratiques
• JBPM-Lab08-Timer-Question

Business Technology Consulting
Thibault Cuvillier
http://www.btcweb.com
Creative Commons

Développer desSurvol
jBPM / Services Web

111
Thibault Cuvillier – Creative Commons 2.0

jBPM

Avancé

WS 1.0 - Template 1.0
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
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
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
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
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

Contenu connexe

En vedette

eServices-Tp2: bpel
eServices-Tp2: bpeleServices-Tp2: bpel
eServices-Tp2: bpelLilia Sfaxi
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web ServicesLilia Sfaxi
 
eServices-Chp4: ESB
eServices-Chp4: ESBeServices-Chp4: ESB
eServices-Chp4: ESBLilia Sfaxi
 
eServices-Chp2: SOA
eServices-Chp2: SOAeServices-Chp2: SOA
eServices-Chp2: SOALilia Sfaxi
 
eServices-Chp1: Introduction
eServices-Chp1: IntroductioneServices-Chp1: Introduction
eServices-Chp1: IntroductionLilia Sfaxi
 
Chp3 - Les Services Web
Chp3 - Les Services WebChp3 - Les Services Web
Chp3 - Les Services WebLilia Sfaxi
 
Chp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOAChp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOALilia Sfaxi
 
eServices-Chp3: Composition de Services
eServices-Chp3: Composition de ServiceseServices-Chp3: Composition de Services
eServices-Chp3: Composition de ServicesLilia Sfaxi
 
eServices-Chp6: WOA
eServices-Chp6: WOAeServices-Chp6: WOA
eServices-Chp6: WOALilia Sfaxi
 
eServices-Chp5: Microservices et API Management
eServices-Chp5: Microservices et API ManagementeServices-Chp5: Microservices et API Management
eServices-Chp5: Microservices et API ManagementLilia Sfaxi
 
Presentation bpel
Presentation bpelPresentation bpel
Presentation bpelAnasse Ej
 

En vedette (12)

eServices-Tp2: bpel
eServices-Tp2: bpeleServices-Tp2: bpel
eServices-Tp2: bpel
 
eServices-Tp1: Web Services
eServices-Tp1: Web ServiceseServices-Tp1: Web Services
eServices-Tp1: Web Services
 
eServices-Chp4: ESB
eServices-Chp4: ESBeServices-Chp4: ESB
eServices-Chp4: ESB
 
eServices-Chp2: SOA
eServices-Chp2: SOAeServices-Chp2: SOA
eServices-Chp2: SOA
 
eServices-Chp1: Introduction
eServices-Chp1: IntroductioneServices-Chp1: Introduction
eServices-Chp1: Introduction
 
Chp3 - Les Services Web
Chp3 - Les Services WebChp3 - Les Services Web
Chp3 - Les Services Web
 
Chp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOAChp1- Introduction aux Technologies Web et SOA
Chp1- Introduction aux Technologies Web et SOA
 
eServices-Chp3: Composition de Services
eServices-Chp3: Composition de ServiceseServices-Chp3: Composition de Services
eServices-Chp3: Composition de Services
 
eServices-Chp6: WOA
eServices-Chp6: WOAeServices-Chp6: WOA
eServices-Chp6: WOA
 
eServices-Chp5: Microservices et API Management
eServices-Chp5: Microservices et API ManagementeServices-Chp5: Microservices et API Management
eServices-Chp5: Microservices et API Management
 
BPMN,jBPM,BPEL
BPMN,jBPM,BPELBPMN,jBPM,BPEL
BPMN,jBPM,BPEL
 
Presentation bpel
Presentation bpelPresentation bpel
Presentation bpel
 

Similaire à Présentation de jBPM 3.1

"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014Benoît de CHATEAUVIEUX
 
Chorégraphie distribuée à partir d’un processus d’orchestration BPMN
Chorégraphie distribuée à partir d’un processus d’orchestration BPMNChorégraphie distribuée à partir d’un processus d’orchestration BPMN
Chorégraphie distribuée à partir d’un processus d’orchestration BPMNmmchaal
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéNicolas Deverge
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring BatchAntoine Rey
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyribaOlivier BAZOUD
 
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...CERTyou Formation
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaOlivier BAZOUD
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Softshake 2015 comment tester et optimiser la performance d'un si
Softshake 2015   comment tester et optimiser la performance d'un siSoftshake 2015   comment tester et optimiser la performance d'un si
Softshake 2015 comment tester et optimiser la performance d'un siMarc Bojoly
 
Webinar Bizagi BPM - Etude de cas client
Webinar Bizagi BPM - Etude de cas clientWebinar Bizagi BPM - Etude de cas client
Webinar Bizagi BPM - Etude de cas clientBizagi
 
Retour Experience Atchik Sigma T9 200903[1]
Retour Experience Atchik Sigma T9 200903[1]Retour Experience Atchik Sigma T9 200903[1]
Retour Experience Atchik Sigma T9 200903[1]almerys
 
Retour d'expérience : gérer des flux vidéos multiples de manière optimisée
Retour d'expérience :  gérer des flux vidéos multiples de manière optimiséeRetour d'expérience :  gérer des flux vidéos multiples de manière optimisée
Retour d'expérience : gérer des flux vidéos multiples de manière optimiséeSilicon Comté
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!CARA_Lyon
 
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie Trudel
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie TrudelHa zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie Trudel
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie TrudelAgile Montréal
 
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-technique
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-techniqueP8155 g formation-ibm-cognos-tm1-administrer-l-environnement-technique
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-techniqueCERTyou Formation
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Kenny Dits
 
ASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSAASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSAFrédéric Sagez
 
20151013 - Agirc arrco : Behavior driven development
20151013 - Agirc arrco : Behavior driven development20151013 - Agirc arrco : Behavior driven development
20151013 - Agirc arrco : Behavior driven developmentLeClubQualiteLogicielle
 

Similaire à Présentation de jBPM 3.1 (20)

"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
 
Chorégraphie distribuée à partir d’un processus d’orchestration BPMN
Chorégraphie distribuée à partir d’un processus d’orchestration BPMNChorégraphie distribuée à partir d’un processus d’orchestration BPMN
Chorégraphie distribuée à partir d’un processus d’orchestration BPMN
 
ToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & AgilitéToulouseJUG - REX Flex, Spring & Agilité
ToulouseJUG - REX Flex, Spring & Agilité
 
Workshop Spring - Session 4 - Spring Batch
Workshop Spring -  Session 4 - Spring BatchWorkshop Spring -  Session 4 - Spring Batch
Workshop Spring - Session 4 - Spring Batch
 
BBL - Monitoring - kyriba
BBL - Monitoring - kyribaBBL - Monitoring - kyriba
BBL - Monitoring - kyriba
 
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
Esa1 g formation-utilisation-de-zmanager-unified-resource-manager-pour-serveu...
 
Power Shell V2 Full
Power Shell V2 FullPower Shell V2 Full
Power Shell V2 Full
 
WS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - XebiaWS User Group - Spring Batch - Xebia
WS User Group - Spring Batch - Xebia
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Softshake 2015 comment tester et optimiser la performance d'un si
Softshake 2015   comment tester et optimiser la performance d'un siSoftshake 2015   comment tester et optimiser la performance d'un si
Softshake 2015 comment tester et optimiser la performance d'un si
 
Webinar Bizagi BPM - Etude de cas client
Webinar Bizagi BPM - Etude de cas clientWebinar Bizagi BPM - Etude de cas client
Webinar Bizagi BPM - Etude de cas client
 
Retour Experience Atchik Sigma T9 200903[1]
Retour Experience Atchik Sigma T9 200903[1]Retour Experience Atchik Sigma T9 200903[1]
Retour Experience Atchik Sigma T9 200903[1]
 
Retour d'expérience : gérer des flux vidéos multiples de manière optimisée
Retour d'expérience :  gérer des flux vidéos multiples de manière optimiséeRetour d'expérience :  gérer des flux vidéos multiples de manière optimisée
Retour d'expérience : gérer des flux vidéos multiples de manière optimisée
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
HTML5... La révolution maintenant!
HTML5... La révolution maintenant!HTML5... La révolution maintenant!
HTML5... La révolution maintenant!
 
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie Trudel
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie TrudelHa zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie Trudel
Ha zut, le DevOps a mangé ma vélocité par Jean-Marc Lavoie & Sylvie Trudel
 
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-technique
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-techniqueP8155 g formation-ibm-cognos-tm1-administrer-l-environnement-technique
P8155 g formation-ibm-cognos-tm1-administrer-l-environnement-technique
 
Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?Monitoring applicatif : Pourquoi et comment ?
Monitoring applicatif : Pourquoi et comment ?
 
ASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSAASFA - Organisation et Méthodologie du projet COLSA
ASFA - Organisation et Méthodologie du projet COLSA
 
20151013 - Agirc arrco : Behavior driven development
20151013 - Agirc arrco : Behavior driven development20151013 - Agirc arrco : Behavior driven development
20151013 - Agirc arrco : Behavior driven development
 

Présentation de jBPM 3.1

  • 1. Copyleft Thibault Cuvillier jBPM 3.1 Thibault Cuvillier Jav@rchitecte Consultant indépendant cuvillier@gmail.com www.btcweb.com WS 1.0 - Template 1.0
  • 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
  • 14. Thibault Cuvillier – Creative Commons 2.0 jBPM Graphe et Contexte WS 1.0 - Template 1.0
  • 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
  • 21. Travaux pratique • JBPM-Lab01-Context-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 21
  • 22. Thibault Cuvillier – Creative Commons 2.0 jBPM Processus, Etat et Transition WS 1.0 - Template 1.0
  • 23. Processus, Etat et Transition 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 23
  • 24. Processus Processus Etat et Transition Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 24
  • 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
  • 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"/> Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 39
  • 40. Travaux pratiques • JBPM-Lab02-Question-Processus Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 40
  • 41. Thibault Cuvillier – Creative Commons 2.0 jBPM Action, Script et Evénements WS 1.0 - Template 1.0
  • 42. Processus, Etat et Transition 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 42
  • 43. Action Action Expression Script Evénement Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 43
  • 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
  • 48. Expression Action Expression Script Evénement Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 48
  • 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
  • 51. Script Action Expression Script Evénement Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 51
  • 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
  • 57. Evénement Action Expression Script Evénement Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 57
  • 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
  • 64. Travaux pratiques • JBPM-Lab03-ActionScript-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 64
  • 65. Thibault Cuvillier – Creative Commons 2.0 jBPM Exceptions WS 1.0 - Template 1.0
  • 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
  • 69. Travaux Pratiques • JBPM-Lab04-Exception-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 69
  • 70. Thibault Cuvillier – Creative Commons 2.0 jBPM Décision WS 1.0 - Template 1.0
  • 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
  • 77. Travaux Pratiques • JBPM-Lab05-Decision-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 77
  • 78. Thibault Cuvillier – Creative Commons 2.0 jBPM Fork et Join WS 1.0 - Template 1.0
  • 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
  • 83. Travaux Pratiques • JBPM-Lab06-ForkJoin Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 83
  • 84. Thibault Cuvillier – Creative Commons 2.0 jBPM Tâches WS 1.0 - Template 1.0
  • 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
  • 104. Travaux Pratiques • JBPM-Lab07-Task-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 104
  • 105. Thibault Cuvillier – Creative Commons 2.0 jBPM Timer WS 1.0 - Template 1.0
  • 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
  • 111. Travaux Pratiques • JBPM-Lab08-Timer-Question Business Technology Consulting Thibault Cuvillier http://www.btcweb.com Creative Commons Développer desSurvol jBPM / Services Web 111
  • 112. Thibault Cuvillier – Creative Commons 2.0 jBPM Avancé WS 1.0 - Template 1.0
  • 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