[Webinar] BPM Renaissance: 5 Tips to Thrive in a Cloud-Native World
JBoss jBPM und Drools - Geschäftsprozesse und Regeln mit Open Source Java
1. Java User Group Berlin Brandenburg
Berlin, 04.02.2009
bernd.ruecker@camunda.com
Vorstellung JBoss jBPM und Drools
Geschäftsprozesse und Regeln mit
Open Source Java
2. Bernd Rücker / ber nd.r uecker @cam unda.com / 2
• Berater, Trainer, Coach
• Softwareentwickler
• Committer im JBoss jBPM-Projekt
• Themen:
– BPM & SOA
– Process Execution (jPDL, BPEL, XPDL, …)
– JBoss SOA Platform (jBPM, ESB, Drools, …)
– Enterprise Anwendungen mit Java EE
• Siehe www.camunda.com
• Blog www.bpm-guide.de
Bernd Rücker
Wer bin ich?
3. Bernd Rücker / ber nd.r uecker @cam unda.com / 3
Eckdaten zum Unternehmen
Einleitung
camunda GmbH
Gegründet: November 2002
camunda services GmbH
Gegründet: März 2008
Mitarbeiter: 6
Sitz: Berlin / Stuttgart
Unsere Leistungen
•Beratung
•Seminare
•Process Hosting
Unsere Themen
• Ganzheitliches BPM
• Prozessautomatisierung
• SOA, BPEL, XPDL,
• JBoss SOA Platform (jBPM,
Drools, ESB)
• BPMN
• BPM-Toolauswahl
4. Bernd Rücker / ber nd.r uecker @cam unda.com / 4
„Ein Prozess ist eine Struktur, deren Elemente Aufgaben,
Aufgabenträger, Sachmittel und Informationen sind, die durch logische
Folgebeziehungen verknüpft sind. Darüber hinaus werden deren
zeitliche, räumliche und mengenmäßige Dimensionen konkretisiert. Ein
Prozess hat ein definiertes Startereignis (Input) und ein Ergebnis (Output)
und dient dazu, einen Wert für Kunden zu schaffen.“
Synonyme: Geschäftsprozess, Business Process
Was ist ein Prozess?
Begriffsdefinition
Kunde Input Output Kunde
Logische
Aufgabenfolge
Fischermanns, Guido:
Praxishandbuch Prozessmanagement
5. Bernd Rücker / ber nd.r uecker @cam unda.com / 5
Einfaches Prozessmodell
Begriffsdefinition
Kunde
Bestel-
lung Lieferung Kunde
Bestell-
annahme
Rechnung-
stellung
Waren-
entnahme
Versand
6. Bernd Rücker / ber nd.r uecker @cam unda.com / 6
Ein „digitaler“ Prozess
mit Business Process Engine
Task
Zuweisung
Service
Aufruf
Task
Zuweisung
IT
Δ Durchlaufzeit
Process Engine
Human Workflow Human WorkflowEAI
SOA
7. Bernd Rücker / ber nd.r uecker @cam unda.com / 7
Process Execution
Business Process Engine
Task
Zuweisung
Service
Aufruf
Task
Zuweisung
Tasklist Externes
System
Transaction / Request
process execution
Zeit
Process Execution Engine
…
Client
1.) Aufgabe erzeugen
2.) Aufgabe abschließen
1.) System aufrufen / Message
2.) Asynchrone Antwort als Message
8. Bernd Rücker / ber nd.r uecker @cam unda.com / 8
Business Process Engine (BPM-Engine)Business Process Engine (BPM-Engine)
Definition Laufzeit
Business Process Engine
Middleware für Geschäftsprozesse
PersistenzPersistenz
Prozess-
Ausführung
Prozess-
Ausführung
Prozess-
definitionen
Prozess-
definitionen
AdministrationAdministrationProzess-
Logs
Prozess-
Logs
Aufgaben-
Verwaltung
Aufgaben-
Verwaltung
Sachbearbeiter
Fremd-
Anwendungen
Fremd-
Anwendungen
Business Analyst
Administrator
Entwickler
SimulationSimulation
9. Bernd Rücker / ber nd.r uecker @cam unda.com / 9
• Business Process Engine
• „Library“
• POJO-Kern: Interne Prozessrepräsentation durch
Java-Modelle
• Persistenz über Hibernate (DB-Unabhängigkeit)
• Lauffähig mit oder ohne Application-Server
• Klein und flexibel, leicht erweiterbar
• Aktuell Version 3.2, Version 4 in der Entwicklung
• Open Source (LGPL)
JBoss jBPM
Open Source Process Execution
13. Bernd Rücker / ber nd.r uecker @cam unda.com / 13
• Process Engine ist eigene Architekturschicht
• Domänenobjekte oder Referenzen als
Prozessvariablen
• Ansteuerung ext.
Services
Business Process Engine in Java
Architektur
EJB-Container (oder Tomcat oder Java SE)EJB-Container (oder Tomcat oder Java SE)
Session
Bean
Session
Bean
JCAJCA JMSJMSEJBEJB
WSWS
jBPM (jPDL)
Human
Task
Mgmnt
Human
Task
Mgmnt
14. Bernd Rücker / ber nd.r uecker @cam unda.com / 14
Prozess: Grafik / XML Java DB
XMLXML
DBDB
jBPM APIjBPM API
deploy
.class.class
Neue
Version
15. Bernd Rücker / ber nd.r uecker @cam unda.com / 15
• Task-Node: Human Tasks / Aufgaben
• State: Wait-States
• Fork / Join: Parallelisierung
• Decision: Automatische Entscheidung
• Start-State / End-State
• Super-State
• Process-State
• …
• Eigene Node-Typen mit
Verhalten können
implementiert werden
Verschiedene Node-Typen
jBPM in a nutshell
16. Bernd Rücker / ber nd.r uecker @cam unda.com / 16
• Einfache Java-API zur Steuerung der Engine
– Prozessstart
– Aufgabenliste
– …
• Aufrufen von „User-Code“
– definierte Stellen im Prozess
– Interface & Java-Klassen
jBPM & Java
jBPM in a nutshell
17. Bernd Rücker / ber nd.r uecker @cam unda.com / 17
public class MyAction implements ActionHandler {
public void execute(ExecutionContext ctx) {
Object var = ctx.getVariable("var");
result = service.doSomething(var);
ctx.setVariable("result", result);
}
}
public class MyAction implements ActionHandler {
public void execute(ExecutionContext ctx) {
Object var = ctx.getVariable("var");
result = service.doSomething(var);
ctx.setVariable("result", result);
}
}
jBPM & Java
jBPM in a nutshell
JbpmConfiguration conf = JbpmConfiguration.getInstance();
JbpmContext context = conf. createJbpmContext();
ProcessInstance pi = context.getGraphSession().
findLatestProcessDefinition("Ticket").createProcessInstance();
pi.getRootToken().signal();
List<TaskInstance> tasks = context.getTaskMgmtSession().
findTaskInstances("Vertrieb");
tasks.get(0).end("Ticket schliessen");
context.close();
JbpmConfiguration conf = JbpmConfiguration.getInstance();
JbpmContext context = conf. createJbpmContext();
ProcessInstance pi = context.getGraphSession().
findLatestProcessDefinition("Ticket").createProcessInstance();
pi.getRootToken().signal();
List<TaskInstance> tasks = context.getTaskMgmtSession().
findTaskInstances("Vertrieb");
tasks.get(0).end("Ticket schliessen");
context.close();
18. Bernd Rücker / ber nd.r uecker @cam unda.com / 18
Command-Pattern
Remote-Zugriffe und Asynchronität
public class TaskInstanceEndCommand
implements Command {
...
public Object execute(JbpmContext jbpmContext) {
TaskInstance taskInstance =
getTaskInstance(jbpmContext);
if (transitionName == null) {
taskInstance.end();
} else {
taskInstance.end(transitionName);
}
return taskInstance;
}
...
}
public class TaskInstanceEndCommand
implements Command {
...
public Object execute(JbpmContext jbpmContext) {
TaskInstance taskInstance =
getTaskInstance(jbpmContext);
if (transitionName == null) {
taskInstance.end();
} else {
taskInstance.end(transitionName);
}
return taskInstance;
}
...
}
19. Bernd Rücker / ber nd.r uecker @cam unda.com / 19
Beispiel: EJB3 + Swing
EJB-ContainerEJB-Container
BPM-Engine
Command
Service
SLSB
JCA JMS …EJB
WebcontainerWebcontainer
Command
Service
MDB
Web-GUI
Swing-GUI
CommandsCommands
Fremd-
systeme
Message
Mit
Commands
Message
Mit
Commands
Korrelation
20. Bernd Rücker / ber nd.r uecker @cam unda.com / 20
Process Execution Languages
Welche Sprache spricht BPM?
BPEL
XPDL
UML
EPC
BPMN
YAML
jPDL
…
Standards
Proprietär
Wissenschaftlich
Fachliche Notationen
DSL‘s
21. Bernd Rücker / ber nd.r uecker @cam unda.com / 21
Quelle: Dr. Martin Bartonitz
Sprachen heute: Was nehmen?
Komplexität, LOC, Mächtigkeit, Standards?
22. Bernd Rücker / ber nd.r uecker @cam unda.com / 22
• Es existieren verschiedenste Prozessausführungs-
sprachen (Process Execution Language)
– BPEL, XPDL, jPDL, DSL‘s, …
• Es gibt nicht die perfekte Sprache
• Koexistenz von verschiedenen Sprachen erlauben
• Sprache nach Problem auswählen
Grundfunktionalität Prozessmaschine in PVM
JBoss Process Virtual Machine
JBoss PVM
23. Bernd Rücker / ber nd.r uecker @cam unda.com / 23
Konzepte & Kernabstraktionen
Prozesse als Zustandsautomat
Verhalten über
Sprache definiert
24. Bernd Rücker / ber nd.r uecker @cam unda.com / 24
Just an API
PVM definiert keine Sprache
ProcessDefinition processDefinition = ProcessFactory.build()
.node("accept loan request").initial().behaviour(new WaitState())
.transition().to("loan evaluation")
.node("loan evaluation").behaviour(new WaitState())
.transition("approve").to("wire the money")
.transition("reject").to("end")
.node("wire the money").behaviour(new Display("automatic payment"))
.transition().to("end")
.node("end").behaviour(new WaitState())
.done();
ProcessDefinition processDefinition = ProcessFactory.build()
.node("accept loan request").initial().behaviour(new WaitState())
.transition().to("loan evaluation")
.node("loan evaluation").behaviour(new WaitState())
.transition("approve").to("wire the money")
.transition("reject").to("end")
.node("wire the money").behaviour(new Display("automatic payment"))
.transition().to("end")
.node("end").behaviour(new WaitState())
.done();
25. Bernd Rücker / ber nd.r uecker @cam unda.com / 25
• Graphen / Blockstruktur
• Sprache kann durch
entsprechendes Node-Verhalten
implementiert werden
• Es wird geben
– XPDL: Nova Bonita
– jPDL: JBoss jBPM JPDL 4
– BPEL: Orchestra
• Sprachen sind in XML umgesetzt
Prozesssprachen
Die PVM unterstützt verschiedene Sprachen
26. Bernd Rücker / ber nd.r uecker @cam unda.com / 26
Was ist BPM?
Human
Workflow Management
Serviceorientierte
Architekturen (SOA)
Dokumenten-Management –
Systeme – DMS (u.a.)
Enterprise Appliation Integration –
EAI
ab 2004
ab 2000 ab 2005
Ablauforganisation
Business Process
Reengineering - BPR
(Orga-) Geschäftsprozess-
Management - GPM
Organisationslehre
bis 1990
1990 - 2000 ab 2000
Business
IT
Prozessautomatisierung
ab 2006
Begriffsproblem
Business Process Management - BPM
27. Bernd Rücker / ber nd.r uecker @cam unda.com / 27
Aktuelle Ambitionen
Der BPM-Kreislauf
Prozess-
implementierung
Prozess-
entwurf
Prozess-
controlling
KVP
Prozess-
Strategie
Business
IT
28. Bernd Rücker / ber nd.r uecker @cam unda.com / 28
Der Traum der Magic BPM-Suite
Der BPM-Kreislauf
Modelling Monitoring
EAI / SOAHuman Workflow
Business
IT
Magic BPM-Suite
29. Bernd Rücker / ber nd.r uecker @cam unda.com / 29
• Aufbauend auf PVM
• Persistenz über JPA geplant
• Unterstützung BPMN
• siehe
http://www.bpm-guide.de/2009/01/26/ein-erster-blick-
JBoss jBPM 4
jBPM die Vierte
30. Bernd Rücker / ber nd.r uecker @cam unda.com / 30
• Allgemeingültige API
– ProcessService
– ExecutionService
– TaskService
– ManagementService
– CommandService
• Grafische Informationen im gleichen XML
• Deployment in AS/ESB wird verbessert
Weitere Änderungen in jBPM 4
jBPM die Vierte
31. Bernd Rücker / ber nd.r uecker @cam unda.com / 31
Beispielprozess im neuen Designer
jBPM die Vierte
33. Bernd Rücker / ber nd.r uecker @cam unda.com / 33
Nicht gut: Regeln im Prozess
Prozessmodelle und Geschäftsregeln
34. Bernd Rücker / ber nd.r uecker @cam unda.com / 34
Regeln sinnvoll abbilden
Auftragswert Rabatt verhandelt? Rabatt (%)
AW < 50 T€ Nein 0
50 T€ <= AW < 100 T€ Nein 3
100 T€ <= AW < 250 T€ Nein 5
<egal> Ja <individuell>
Prozessmodelle und Geschäftsregeln
35. Bernd Rücker / ber nd.r uecker @cam unda.com / 35
Was sind Regeln?
• „Wenn ich müde bin, dann gehe ich ins Bett!“
• „WENN .. DANN ..“-Struktur
• Bedingung und Konseqenz (Prämisse und
Konklusion; Left-Hand-Side LHS und Right-Hand-
Side RHS)
• Konsequenz wird häufig als „Aktion“ bezeichnet
• Bedingungen prüfen „Fakten“
• Regeln „feuern“, wenn deren Bedingung eintrifft
36. Bernd Rücker / ber nd.r uecker @cam unda.com / 36
• Direkte Programmierung im Quellcode:
if ( person.istMuede() == true ) {
person.putzeZaehne();
person.geheInsBett();
}
• Spezifische Lösungen (Codegenerierung, DSL,
Speziallösungen, …)
• Regelmaschine / Rule Engine
Wie werden Regeln umgesetzt?
Alternativen
37. Bernd Rücker / ber nd.r uecker @cam unda.com / 37
• Wartbarkeit und Validierbarkeit nicht gegeben
• Regeln müssen durch Entwickler in Quellcode
übersetzt werden
• Fachliche Regeln werden über verschiedene
Klassen verteilt
• Keine Lesbarkeit der Regeln für den Fachbereich
• Konflikt-Lösung muss realisiert werden
Probleme programmierter Regeln
Wie werden Regeln umgesetzt?
38. Bernd Rücker / ber nd.r uecker @cam unda.com / 38
• Explizite Formulierung der Regeln als Regeln
• Deklarativ: Welche Regeln wann wie ausgeführt
werden entscheidet die Regelmaschine
• Regeln für Fachbereich verständlich
Vorteile der Rule-Engine
Wie werden Regeln umgesetzt?
Bedingung:
Person.muede = true
Konsequenz:
person.putzeZaehne();
person.geheInsBett();
Bedingung:
Person.muede = true
Konsequenz:
person.putzeZaehne();
person.geheInsBett();
39. Bernd Rücker / ber nd.r uecker @cam unda.com / 39
• Fakten (Wissen) = Domänenobjekte (POJOs)
• Rule Engine wird generisch in die Architektur
integriert (Interceptoren, …)
• Rule Engine wird gezielt angesprochen
Rule Engines in Java
Architektur
ClientClient Anwendung / ServerAnwendung / Server
InterceptorInterceptor
FachlogikFachlogik
40. Bernd Rücker / ber nd.r uecker @cam unda.com / 40
• Java Rule Engine (RETE-Implementierung)
• „JBoss Drools“ / „JBoss Rules“
• Lauffähig mit oder ohne Application-Server
• „Library“
• Business Rules Management System (BRMS)
• Aktuell Version 4.0 (Version 5 in der Pipe)
• Open Source (ASL)
JBoss Drools
Die Open Source Rule Engine
41. Bernd Rücker / ber nd.r uecker @cam unda.com / 41
Drools-Regeln
Beispiel
package com.camunda.demo
import demo.business.*;
import demo.infrastructure.ErrorList;
global ErrorList errors;
rule "Auftragsrabatt bei hohem Bestellwert"
when
o: Order( value>5000 )
then
o.setDiscount(0.05);
end
rule "Nachnahme nur bis 2500 € möglich"
when
o: Order( value>2500, shippingType="COD" )
then
errors.addError("Nachname nicht möglich bei Auftragswert " + o.getValue());
end
package com.camunda.demo
import demo.business.*;
import demo.infrastructure.ErrorList;
global ErrorList errors;
rule "Auftragsrabatt bei hohem Bestellwert"
when
o: Order( value>5000 )
then
o.setDiscount(0.05);
end
rule "Nachnahme nur bis 2500 € möglich"
when
o: Order( value>2500, shippingType="COD" )
then
errors.addError("Nachname nicht möglich bei Auftragswert " + o.getValue());
end
42. Bernd Rücker / ber nd.r uecker @cam unda.com / 42
Drools im Einsatz
API
RuleBaseLoader loader = RuleBaseLoader.getInstance();
RuleBase ruleBase = loader.loadFromReader(
new
InputStreamReader(this.getClass().getResourceAsStream(
"/demo.drl")));
WorkingMemory wm = ruleBase.newStatefulSession();
wm.insert(meldung);
wm.fireAllRules();
RuleBaseLoader loader = RuleBaseLoader.getInstance();
RuleBase ruleBase = loader.loadFromReader(
new
InputStreamReader(this.getClass().getResourceAsStream(
"/demo.drl")));
WorkingMemory wm = ruleBase.newStatefulSession();
wm.insert(meldung);
wm.fireAllRules();
WorkingMemory
POJO‘s
Regeln
fireAllRules
43. Bernd Rücker / ber nd.r uecker @cam unda.com / 43
There are four Golfers standing at a tee, in a line from
left to right
• The golfer to Fred’s immediate right is wearing blue
pants
• Joe is second in line
• Bob is wearing plaid pants
• Tom isn’t in position one or four, and he isn’t
wearing the orange pants
Beispiel: Golfer Riddle
Drools
44. Bernd Rücker / ber nd.r uecker @cam unda.com / 44
Regelbeispiel
Example: Golfer Riddle
rule "find solution“
when
// There is a golfer named Fred,
// Whose positions is $p1
$fred : Golfer( name == "Fred" )
// Joe is in position 2
$joe : Golfer( name == "Joe",
position == 2,
position != $fred.position,
color != $fred.color )
...
then
System.out.println( "Fred " + $fred.getPosition() + " " + $fred.getColor() );
System.out.println( "Joe " + $joe.getPosition() + " " + $joe.getColor() );
System.out.println( "Bob " + $bob.getPosition() + " " + $bob.getColor() );
System.out.println( "Tom " + $tom.getPosition() + " " + $tom.getColor() );
end
rule "find solution“
when
// There is a golfer named Fred,
// Whose positions is $p1
$fred : Golfer( name == "Fred" )
// Joe is in position 2
$joe : Golfer( name == "Joe",
position == 2,
position != $fred.position,
color != $fred.color )
...
then
System.out.println( "Fred " + $fred.getPosition() + " " + $fred.getColor() );
System.out.println( "Joe " + $joe.getPosition() + " " + $joe.getColor() );
System.out.println( "Bob " + $bob.getPosition() + " " + $bob.getColor() );
System.out.println( "Tom " + $tom.getPosition() + " " + $tom.getColor() );
end
45. Bernd Rücker / ber nd.r uecker @cam unda.com / 45
• In-memory Knowledge-Repository
• Basiert auf Rete Algorithm
• Forward chaining
• Backward
chaining ist
geplant
(Drools 5?)
Drools im Einsatz
Wie funktioniert es intern?
46. Bernd Rücker / ber nd.r uecker @cam unda.com / 46
Für den Fachbereich: Decision Tables
47. Bernd Rücker / ber nd.r uecker @cam unda.com / 47
DSL-Support
Drools
rule "Abmeldung - Check mit DSL"
when
Versicherter unter 25 Jahre alt
and
Mehr als 3 Unfälle gebaut
then
Police nicht möglich
end
rule "Abmeldung - Check mit DSL"
when
Versicherter unter 25 Jahre alt
and
Mehr als 3 Unfälle gebaut
then
Police nicht möglich
end
[when]Versicherter unter {MindestAlter} Jahre alt=
Person( age < {MindestAlter} )
[when]Mehr als {Anzahl} Unfälle gebaut=
Person( accidentCount > {Anzahl} )
...
[then]Police nicht möglich=
errors.addError("Police kann nicht ausgestellt werden");
[when]Versicherter unter {MindestAlter} Jahre alt=
Person( age < {MindestAlter} )
[when]Mehr als {Anzahl} Unfälle gebaut=
Person( accidentCount > {Anzahl} )
...
[then]Police nicht möglich=
errors.addError("Police kann nicht ausgestellt werden");
49. Bernd Rücker / ber nd.r uecker @cam unda.com / 49
Regeleditor ohne DSL
Drools
50. Bernd Rücker / ber nd.r uecker @cam unda.com / 50
Guided Rule Editor
Verfügbar in
Eclipse &
BRMS
51. Bernd Rücker / ber nd.r uecker @cam unda.com / 51
• Welche Regeln sollen in welcher Reihenfolge
• Parallel oder
• unter welchen Bedingungen ausgeführt werden
RuleFlow
Grahpical representation
64. Bernd Rücker / ber nd.r uecker @cam unda.com / 64
• jBPM ist eine kleine, flexible Process Engine.
Bewährt auch in großen Projekten!
• Drools ist cool und steht teuren Rule Engines in
wenig nach
• Integrieren & Kombinieren!
• siehe auch JBoss SOA Plattform (ESB)
• BPM & BRM bleiben Thema, selbst wenn SOA Tod
ist ;-)
Fazit
Geschäftsprozesse und Regeln mit jBPM und Drools