Upload
camunda-services-gmbh
View
665
Download
6
Embed Size (px)
DESCRIPTION
Citation preview
Real-Life-BPM mit Java EE
Ein Erfahrungsbericht
Dr. Sven Jörges | IHK-GfI mbH
• IT-Tochtergesellschaft der deutschen Industrie- und
Handelskammern (IHKs) und des Deutschen Industrie- und
Handelskammertages (DIHK)
• Seit mehr als 40 Jahren
Kunden
• Die 80 deutschen IHKs und der DIHK.
• Täglich bundesweit mehr als 8.000 IHK-MitarbeiterInnen.
Software-Landschaft
Motivation: Prozesse
• insbes. im ERP-System EVA generischer Aufbau, keine
„Benutzerführung“
• viel Know-how beim Sachbearbeiter notwendig
• Idee: Führung des Sachbearbeiters durch Prozesse
Beispiel: Guthabenerstattung
(Ist-Zustand)
Beispiel: Guthabenerstattung
(mit Prozessunterstützung)
BPMN 2.0
SaaS
Mandantenfähigkeit
Performance und Verfügbarkeit
Support
Auswahl und PoC
Quelle:
Quelle:
Quelle:
34
Oracle BPM Suite
IBM Business Process Manager
Intalio
activeVOS
jBPM
Bonita Open Solution
Activiti
• Native BPMN Process Engine
• Open Source (Apache License 2.0)
• leichtgewichtig
Quelle: http://www.activiti.org/userguide/
Activiti
• Spezielle Unterstützung für JEE
• Zusätzliche Tools (Monitoring, Tasklist, …)
• Support durch camunda
camunda fox
Quelle:
Quelle:
fox cockpit
Activiti
Drools
Aufbau der Process Engine
Deployment
EJB
JAX-WS, XIHK
Beispiel-Client: EVA
Stolpersteine
BPMN 2.0
SaaS
Mandantenfähigkeit
Performance und Verfügbarkeit
Support
Mandant aus Benutzername ableitbar:
101joerges
Mandant aus Benutzername ableitbar:
101joerges
Lösung: Konfiguration von DB-Schema-Präfixen in der fox engine
<process-engines>
<!-- Kammer 101 -->
<process-engine name="101" default="true">
<datasource>jdbc/FoxEngine</datasource>
<history-level>audit</history-level>
<properties>
<property name="dbTablePrefix">IHK101.</property>
…
</properties>
</process-engine>
<!-- Kammer 106 -->
<process-engine name="106" default="false">
…
</process-engine>
…
</process-engines>
BPMN 2.0
SaaS
Mandantenfähigkeit
Performance und Verfügbarkeit
Support
Query-API
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
Problem: „Query-API“
für unsere Anforderungen unzureichend
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
Problem: „Query-API“ von Activiti
für unsere Anforderungen unzureichend
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
Lösung: Eigene Queries mittels MyBatis
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
Lösung: Eigene Queries mittels MyBatis
taskService.createTaskQuery()
.taskAssignee("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
taskService.createTaskQuery()
.taskOwner("101joerges")
.taskPriority(50)
.orderByDueDate()
.asc()
.list()
Lösung: Eigene Queries mittels MyBatis
Alternative Lösung: Native Queries per API
(allerdings beschränkt auf die Standard-Engine-Objekte)
BPMN 2.0
SaaS
Mandantenfähigkeit
Performance und Verfügbarkeit
Support
<userTask activiti:formKey="Dummy“ …>
<extensionElements>
<activiti:formProperty id="nichtLesbaresProperty"
name="Nicht lesbar" readable="false"/>
<activiti:formProperty id="nichtSchreibbaresProperty"
name="Nicht schreibbar" writable="false"/>
<activiti:formProperty id="schreibbaresProperty"
name="Schreibbar" writable="true"/>
<activiti:formProperty id="schreibbaresMussProperty"
name="Schreibbar und Muss" required="true" writable="true"/>
</extensionElements>
…
</userTask>
<userTask activiti:formKey="Dummy“ …>
<extensionElements>
<activiti:formProperty id="nichtLesbaresProperty"
name="Nicht lesbar" readable="false"/>
<activiti:formProperty id="nichtSchreibbaresProperty"
name="Nicht schreibbar" writable="false"/>
<activiti:formProperty id="schreibbaresProperty"
name="Schreibbar" writable="true"/>
<activiti:formProperty id="schreibbaresMussProperty"
name="Schreibbar und Muss" required="true" writable="true"/>
</extensionElements>
…
</userTask>
Quelle: http://www.activiti.org/userguide/
<userTask activiti:formKey="Dummy“ …>
<extensionElements>
<activiti:formProperty id="nichtLesbaresProperty"
name="Nicht lesbar" readable="false"/>
<activiti:formProperty id="nichtSchreibbaresProperty"
name="Nicht schreibbar" writable="false"/>
<activiti:formProperty id="schreibbaresProperty"
name="Schreibbar" writable="true"/>
<activiti:formProperty id="schreibbaresMussProperty"
name="Schreibbar und Muss" required="true" writable="true"/>
</extensionElements>
…
</userTask>
<userTask activiti:formKey="Dummy“ …>
<extensionElements>
<activiti:formProperty id="nichtLesbaresProperty"
name="Nicht lesbar" readable="false"/>
<activiti:formProperty id="nichtSchreibbaresProperty"
name="Nicht schreibbar" writable="false"/>
<activiti:formProperty id="schreibbaresProperty"
name="Schreibbar" writable="true"/>
<activiti:formProperty id="schreibbaresMussProperty"
name="Schreibbar und Muss" required="true" writable="true"/>
</extensionElements>
…
</userTask>
{
“actionId“ : “Bankverbindung“,
“actionName“ : “Bankverbindung pflegen…“,
“tabName“ : “Bankverbindung“
}
Weitere Stolpersteine: Prozess-Deployment
? Mehrere Versionen eines Prozesses gleichzeitig betreiben?
! Versionierung.
? Und bei Änderungen an (Java-)Services?
! Process Applications
72
Process Applications
73
• „Bündel“ von Prozessen
• Deployment als JAR,
WAR, EAR
• Hot Deployment
Process Applications
74
<process-archives>
<process-archive>
<name>BeitragGuthabenerstattungProcesses_101</name>
<configuration>
<process-engine>101</process-engine>
<undeployment delete="false" />
</configuration>
<process resourceName="processes/beitrag
-guthabenerstattung.bpmn" />
</process-archive>
…
</process-archives>
Was kommt noch?
Maskengenerierung
Form Properties
UI-Description DSL(s)
„Versionshölle“
Prozess-Management
Migration auf camunda BPM
79
Fazit
camunda BPM =
Process Engine
auf Enterprise-
Niveau
Erfolgsfaktor Open Source
Do it yourself! Frage die Community!
Contribute!
E-Mail: [email protected]
Website: www.ihk-gfi.de
Twitter: http://www.twitter.com/ihkgfi/
Facebook: http://www.facebook.com/ihkgfi
IHK Gesellschaft für
Informationsverarbeitung mbH
Emil-Figge-Str. 86
44227 Dortmund
Fon: 0231 / 9746 – 0
Fax: 0231 / 9746 – 111
E-Mail: [email protected]