Post on 05-Jul-2015
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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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ückerWer bin ich?
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 3
Eckdaten zum UnternehmenEinleitung
camunda GmbHGegründet: November 2002
camunda services GmbHGegründet: März 2008
Mitarbeiter: 6Sitz: 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 KundeLogische
Aufgabenfolge
Fischermanns, Guido:Praxishandbuch Prozessmanagement
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 5
Einfaches ProzessmodellBegriffsdefinition
KundeBestel-
lung Lieferung KundeBestell-
annahme
Rechnung-stellung
Waren- entnahme
Versand
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 6
Ein „digitaler“ Prozessmit Business Process Engine
TaskZuweisung
ServiceAufruf
TaskZuweisung
IT
Δ Durchlaufzeit
Process Engine
Human Workflow Human WorkflowEAISOA
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 7
Process ExecutionBusiness Process Engine
TaskZuweisung
ServiceAufruf
TaskZuweisung
Tasklist ExternesSystem
Transaction / Request
process execution
Zeit
Process Execution Engine
…
Client
1.) Aufgabe erzeugen2.) Aufgabe abschließen
1.) System aufrufen / Message2.) Asynchrone Antwort als Message
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 8
Business Process Engine (BPM-Engine)Business Process Engine (BPM-Engine)
Definition Laufzeit
Business Process EngineMiddleware für Geschäftsprozesse
PersistenzPersistenz
Prozess-AusführungProzess-Ausführung
Prozess-definitionenProzess-definitionen
AdministrationAdministrationProzess-Logs
Prozess-Logs
Aufgaben-VerwaltungAufgaben-Verwaltung
Sachbearbeiter
Fremd-AnwendungenFremd-
Anwendungen
Business Analyst
Administrator
Entwickler
SimulationSimulation
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 jBPMOpen Source Process Execution
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 10
„Graph oriented programming“Der Prozess als gerichteter Graph
Node
Transition
from to
**leaving
Transitions
arrivingTransitions
Token
currentNode
1
<process-definition> ... <node name=“serve client”> <transition name=“ok” to=“order” /> <transition name=“nok” to=“joke” /> </node> <node name=“order” /> <node name=“joke” /> ...</process-definition>
<process-definition> ... <node name=“serve client”> <transition name=“ok” to=“order” /> <transition name=“nok” to=“joke” /> </node> <node name=“order” /> <node name=“joke” /> ...</process-definition>
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 11
• Execute Methode implementiert Verhalten• Konfiguration der Node-Typen per XML
Implementierung Verhalten
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 12
Token-Hierarchie
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 13
• Process Engine ist eigene Architekturschicht• Domänenobjekte oder Referenzen als
Prozessvariablen• Ansteuerung ext.
Services
Business Process Engine in JavaArchitektur
EJB-Container (oder Tomcat oder Java SE)EJB-Container (oder Tomcat oder Java SE)
SessionBeanSessionBean
JCAJCA JMSJMSEJBEJB
WSWS
jBPM (jPDL)HumanTask
Mgmnt
HumanTask
Mgmnt
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 14
Prozess: Grafik / XML Java DB
XMLXML
DBDB
jBPM APIjBPM APIdeploy
.class.classNeue Version
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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-TypenjBPM in a nutshell
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 16
• Einfache Java-API zur Steuerung der Engine– Prozessstart– Aufgabenliste
– …
• Aufrufen von „User-Code“ – definierte Stellen im Prozess
– Interface & Java-Klassen
jBPM & JavajBPM in a nutshell
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 & JavajBPM 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();
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 18
Command-PatternRemote-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; } ...}
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 19
Beispiel: EJB3 + Swing
EJB-ContainerEJB-ContainerBPM-Engine
CommandServiceSLSB
JCA JMS …EJB
WebcontainerWebcontainer
CommandServiceMDB
Web-GUI
Swing-GUI
CommandsCommands
Fremd-systeme
MessageMitCommands
MessageMitCommands
Korrelation
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 20
Process Execution LanguagesWelche Sprache spricht BPM?
BPEL
XPDL
UML
EPC
BPMN
YAML
jPDL
…
Standards
Proprietär
Wissenschaftlich
Fachliche Notationen
DSL‘s
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 21
Quelle: Dr. Martin Bartonitz
Sprachen heute: Was nehmen?Komplexität, LOC, Mächtigkeit, Standards?
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 MachineJBoss PVM
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 23
Konzepte & KernabstraktionenProzesse als Zustandsautomat
Verhalten über Sprache definiert
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 24
Just an APIPVM 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();
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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
ProzesssprachenDie PVM unterstützt verschiedene Sprachen
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 26
Was ist BPM?
HumanWorkflow Management
ServiceorientierteArchitekturen (SOA)
Dokumenten-Management –Systeme – DMS (u.a.)
Enterprise Appliation Integration –EAI
ab 2004
ab 2000 ab 2005
AblauforganisationBusiness 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 27
Aktuelle AmbitionenDer BPM-Kreislauf
Prozess-implementierung
Prozess-entwurf
Prozess-controlling
KVP
Prozess-Strategie
Business
IT
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 28
Der Traum der Magic BPM-SuiteDer BPM-Kreislauf
Modelling Monitoring
EAI / SOAHuman Workflow
Business
ITMagic BPM-Suite
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 29
• Aufbauend auf PVM• Persistenz über JPA geplant• Unterstützung BPMN• siehe
http://www.bpm-guide.de/2009/01/26/ein-erster-blick-auf-jbpm-4/
JBoss jBPM 4jBPM die Vierte
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 30
• Allgemeingültige API– ProcessService– ExecutionService
– TaskService
– ManagementService– CommandService
• Grafische Informationen im gleichen XML
• Deployment in AS/ESB wird verbessert
Weitere Änderungen in jBPM 4jBPM die Vierte
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 31
Beispielprozess im neuen DesignerjBPM die Vierte
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 32
Und das Beispiel als QuellcodeBPM die Vierte
<process xmlns="http://jbpm.org/4/jpdl" name="TicketProcess"> <start name="Start" g="15,146,48,48"> <flow to="Kundenbetreuer bekannt?"/> </start> <exclusive name="Kundenbetreuer bekannt?" g="84,144,48,48"> <flow to="Kundenbetreuer festlegen" g="108,24"> <condition expr="#{false}"/> </flow> <flow to="join"> <condition expr="#{true}"/> </flow> </exclusive> <task name="Kundenbetreuer festlegen" g="168,0,153,51" assignee="bernd"> <flow to="CRM aktualisieren"/> </task>
<process xmlns="http://jbpm.org/4/jpdl" name="TicketProcess"> <start name="Start" g="15,146,48,48"> <flow to="Kundenbetreuer bekannt?"/> </start> <exclusive name="Kundenbetreuer bekannt?" g="84,144,48,48"> <flow to="Kundenbetreuer festlegen" g="108,24"> <condition expr="#{false}"/> </flow> <flow to="join"> <condition expr="#{true}"/> </flow> </exclusive> <task name="Kundenbetreuer festlegen" g="168,0,153,51" assignee="bernd"> <flow to="CRM aktualisieren"/> </task>
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 33
Nicht gut: Regeln im ProzessProzessmodelle und Geschäftsregeln
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 RegelnWie werden Regeln umgesetzt?
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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-EngineWie werden Regeln umgesetzt?
Bedingung: Person.muede = true Konsequenz: person.putzeZaehne(); person.geheInsBett();
Bedingung: Person.muede = true Konsequenz: person.putzeZaehne(); person.geheInsBett();
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 39
• Fakten (Wissen) = Domänenobjekte (POJOs)• Rule Engine wird generisch in die Architektur
integriert (Interceptoren, …)• Rule Engine wird gezielt angesprochen
Rule Engines in JavaArchitektur
ClientClient Anwendung / ServerAnwendung / Server
InterceptorInterceptor
FachlogikFachlogik
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 DroolsDie Open Source Rule Engine
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 41
Drools-RegelnBeispiel
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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 42
Drools im EinsatzAPI
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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 RiddleDrools
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 44
RegelbeispielExample: 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
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 45
• In-memory Knowledge-Repository• Basiert auf Rete Algorithm• Forward chaining• Backward
chaining istgeplant (Drools 5?)
Drools im EinsatzWie funktioniert es intern?
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 46
Für den Fachbereich: Decision Tables
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 47
DSL-SupportDrools
rule "Abmeldung - Check mit DSL"when Versicherter unter 25 Jahre alt and Mehr als 3 Unfälle gebautthen Police nicht möglichend
rule "Abmeldung - Check mit DSL"when Versicherter unter 25 Jahre alt and Mehr als 3 Unfälle gebautthen Police nicht möglichend
[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");
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 48
DSL-SupportDrools
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 49
Regeleditor ohne DSLDrools
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 50
Guided Rule Editor
Verfügbar in Eclipse & BRMS
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 51
• Welche Regeln sollen in welcher Reihenfolge• Parallel oder• unter welchen Bedingungen ausgeführt werden
RuleFlowGrahpical representation
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 52
Tooling: EclipseDrools
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 53
Business Rules Management SystemDrools BRMS
ServerServer
DroolsDrools
Web-GUIWeb-GUI
Rule-Repository (JCR)
Rule-Repository (JCR)
AnwendungAnwendung
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 54
BPM + !BRM = ? !BPM + BRM = ? BPM + BRM = ?
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 55
• Möglich!• Vorteil: Maximale Flexibilität• Nachteile
– Keine Visualisierung / Modellierung des Prozessflusses – Nicht immer offensichtlich, warum was passiert– Keine „Grenzen“ durch Prozessstruktur
– Keine out-of-the-box Wartezustände / Persistenz
Geschäftsprozesse mit Regeln umsetzen?BPM + BRM
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 56
• BPM (Prozesse)– Geschäftsprozesse / Workflows– Fachliche Modellierung
– Hoher Standardisierungs-/Wiederholungsgrad
• BRM (Regeln)– Prozessunabhängige Regeln
– Punktuelle Integration in Prozesse
– Beeinflussung des Prozessablaufs (80/20 Regel)
In Kombination stabilere Prozesse bei mehr Agilität!
EinsatzmöglichkeitenBPM + BRM
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 57
Kombinationsmöglichkeiten
Regeln treffen EntscheidungenRegeln treffen Entscheidungen
Regeln steuern Zuweisung von AufgabenRegeln steuern Zuweisung von Aufgaben
Regeln schließen neues WissenRegeln schließen neues Wissen
Und: Beeinflussung des Prozessablaufs in
Sonderfällen
Und: Beeinflussung des Prozessablaufs in
Sonderfällen
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 58
Schließen von “neuem Wissen”jBPM + Drools
rule "Special Discount"when o : Order( customerName == "Bernd" )then # 5 % discount o.applyDiscount( 0.95 ); System.out.println("Special discount granted");end
rule "Special Discount"when o : Order( customerName == "Bernd" )then # 5 % discount o.applyDiscount( 0.95 ); System.out.println("Special discount granted");end
<action class="org.jbpm.action.RulesActionHandler"> <ruleFile>/...OrderPricingRules.drl</ruleFile> <objectNames> <element>order</element> </objectNames></action>
<action class="org.jbpm.action.RulesActionHandler"> <ruleFile>/...OrderPricingRules.drl</ruleFile> <objectNames> <element>order</element> </objectNames></action>
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 59
EntscheidungenjBPM + Drools
<node name="drools decision"> <action class="org.jbpm.action.RulesActionHandler“> <ruleFile>/com/.../OrderDecisionRules.drl</ruleFile> <objectNames> <element>order</element> </objectNames> <signalToken>false</signalToken> </action> <transition name="conspicuous" to="do something" /> <transition name="casual" to="determine discount" /></node>
<node name="drools decision"> <action class="org.jbpm.action.RulesActionHandler“> <ruleFile>/com/.../OrderDecisionRules.drl</ruleFile> <objectNames> <element>order</element> </objectNames> <signalToken>false</signalToken> </action> <transition name="conspicuous" to="do something" /> <transition name="casual" to="determine discount" /></node>
rule "Conspicuous Order"when Order( price > 500)then System.out.println("signal conspicuous order"); executionContext.getNode(). leave(executionContext, "conspicuous");end
rule "Conspicuous Order"when Order( price > 500)then System.out.println("signal conspicuous order"); executionContext.getNode(). leave(executionContext, "conspicuous");end
Besseres Design:Regeln schreiben Ergebnis in Prozessvariable und jBPM „Decision“ wertet diese aus
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 60
Beeinflussung des ProzessablaufsEvent getrieben reagieren / Ausnahmen
rule "Order gets cancelled"when evt : Event( type == "cancel" )then token.setNode( "end2" );end
rule "Order gets cancelled"when evt : Event( type == "cancel" )then token.setNode( "end2" );end
Token
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 61
Actor-AssignmentWer ist zuständig?
<assignment class="org.jbpm.assignment.RulesAssignmentHandler"> <group>underwriting</group> <ruleFile>/Assignment.drl</ruleFile> <objectNames><element>policy</element></objectNames></assignment>
<assignment class="org.jbpm.assignment.RulesAssignmentHandler"> <group>underwriting</group> <ruleFile>/Assignment.drl</ruleFile> <objectNames><element>policy</element></objectNames></assignment>
rule "Determine Junior Role“when Policy( basePrice < 500)then insert(new Role("junior"));end
rule "Determine Actor"salience -100when Role($roleName : roleName) $a : Assignable() $group : Group() Membership( group == $group, role == $roleName, $user : user )then $a.setActorId($user.getName());end
rule "Determine Junior Role“when Policy( basePrice < 500)then insert(new Role("junior"));end
rule "Determine Actor"salience -100when Role($roleName : roleName) $a : Assignable() $group : Group() Membership( group == $group, role == $roleName, $user : user )then $a.setActorId($user.getName());end
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 62
Ausblick: ESB / Content Based RoutingBeispiel: JBoss jBPM jPDL + JBoss ESB
Environment JBoss jBPMJBoss ESB
Content-Based Router ServiceContent-Based Router Service
System 1System 1
System 2System 2
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 63
ESB & Content Based RoutingVergleiche Event Driven Architecture (EDA)
Quelle: JBoss
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 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 ;-)
FazitGeschäftsprozesse und Regeln mit jBPM und Drools
Ber n d R ü c k er / b er n d .r u ec k er @c am u n d a.c om / 65
Fragen & Antworten
Unsere Themen• Ganzheitliches BPM• Prozessautomatisierung• SOA, BPEL, XPDL, jBPM, Drools, ESB• BPMN• BPM-Toolauswahl
Unsere Leistungen• Beratung• Seminare• Process Hosting
Bernd RückerGeschäftsführerBerater, Trainer & Coachbernd.ruecker@camunda.com+49 711 3278645+49 171 1473461
Aktuelle Jobs:
http://www.camunda.com/jobs/
Aktuelle Jobs:
http://www.camunda.com/jobs/