IHK GfI

Preview:

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: joerges@gfi.ihk.de

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: info@gfi.ihk.de

Recommended