Case Management und CMMN für Entwickler

Praxis

Anwendungsgebiete in der Praxis

Typische Szenarien für CMMN sind in Versicherungen neben den Anträgen die Schadensabwicklungsprozesse. Ein weiteres Einsatzgebiet sind medizinische Anwendungen wie ie Behandlung eines Patienten im Krankenhaus oder in einer Reha-Einrichtung. Ansonsten lässt sich CMMN auch verwenden, um Ausnahmebehandlung abzubilden. In den Fällen kann der eventuell vollautomatisierte Prozessfluss unterbrochen werden, um einen Problemfall durch den Menschen zu klären. Beispiele dafür sind Zuordnungsprobleme bei automatisierten Dokumenteneingangsprozessen, Leseprobleme bei Scanstrecken, Ausnahmebehandlung in Callcentern und so weiter.

CMMN kann des Weiteren auch als ein Schritt auf dem Weg zu einem BPMN-Modell gesehen werden, denn eventuell stößt die direkte Vollautomatisierung eines bisher manuell durchgeführten Prozesses auf Ablehnung bei den Sachbearbeitern. In dem Fall lassen sich dem Bearbeiter über CMMN mehr Eingriffsmöglichkeiten bieten, um die Akzeptanz zu erhöhen. Den Grad der Automatisierung kann man dann schrittweise mit wachsendem Prozessverständnis bei den Mitarbeitern erhöhen. Dabei kann auch die Auswertung der bereits gesammelten Audit-Daten der CMMN-Engine helfen.

Blick in den Quellcode

Für ein besseres Verständnis soll als konkretes Beispiel Camunda BPM dienen. Camunda hat sich, in Abgrenzung zu sogenannten Zero Code Suites, Entwicklerfreundlichkeit auf die Fahne geschrieben. Dementsprechend kann man eine Process Engine mit Standardkonfiguration und In-Memory-Datenbank mit einer Zeile Java hochfahren:

ProcessEngine engine = new
StandaloneInMemProcessEngineConfiguration().buildProcessEngine();

Danach lässt sich mit der Java API der Camunda Engine arbeiten, was im Artikel anhand eines JUnit-Testcases gezeigt wird. Die in JSF entwickelte Oberfläche benutzt die gleiche API, um Informationen zu lesen oder Änderungen an der Case-Instanz anzustoßen. Die Engine lässt sich genauso gut per REST-API steuern, sodass die Verwendung auch in anderen Szenarien möglich wird, zum Beispiel in JavaScript-, .NET- oder PHP-Anwendungen.

Der folgende Quelltextauszug zeigt einen Ausschnitt eines Testcases, der eine neue Case-Instanz startet. Wer Camunda kennt, wird die Parallelen zu BPMN-Prozessinstanzen erkennen. Tatsächlich wurde CMMN in die bestehende Engine integriert und lässt sich eng mit BPMN verzahnen.

// HashMap containing variables to be added to case instance

VariableMap variables =
Variables.createVariables().putValue("application",
new Application());

// create the case instance, this persists it in the database too
CaseInstance caseInstance =
processEngine.getCaseService().createCaseInstanceByKey(
"underwriting", variables);

// load tasks via Query API and assert that we have one task
// created (corresponding to one active Activity)
List<Task> tasks = processEngine.getTaskService().
createTaskQuery().list();
assertEquals(1, tasks.size());
// use camunda assertions to check we created the right task:
assertThat(tasks.get(0)).hasDefinitionKey("PI_humanTaskDecide");

// load all so called "executions" of a Case Instance, basically
//corresponding to Activities in our case
List<CaseExecution> caseExecutions =
processEngine.getCaseService().createCaseExecutionQuery().list();
for (CaseExecution caseExecution : caseExecutions) {
if (caseExecution.isEnabled()) {
System.out.println("Possible to start ('enabled'): " +
caseExecution.getActivityName() + " [" +
caseExecution.getActivityType() + "]");
} // else...
}

// complete task - changes the state of the case instance
processEngine.getTaskService().complete(tasks.get(0).getId());

// we could check completed activities now:
processEngine.getHistoryService().
createHistoricCaseActivityInstanceQuery()
.caseInstanceId(caseInstance.getId()).list();

Einer Case-Instanz lassen sich Daten übergeben, die auch in den Wächtern verwendet werden, um Bedingungen zu formulieren. Camunda verwendet dafür JUEL (Java Unified Expression Language), sodass die erwähnte Prüfung, ob es sich um einen Raucher handelt, vergleichsweise einfach ausfällt (sofern man annehmen kann, dass es ein entsprechendes Attribut in der Klasse Application gibt).

Ein Blick in das unten gezeigte CMMN-XML zeigt, wie eine Aktivität mit Sentry definiert wird. Wie man erkennen kann, ist das XML-Format nicht weiter kompliziert. Außerdem lassen sich alle Aktivitäten in CMMN an unterschiedlichen Stellen im Modell wiederverwenden. Deswegen ist der Human Task separat definiert und als sogenanntes Plan Item in den Case eingebunden.

<cmmn:planItem id="PI_humanTaskSmoker" definitionRef="humanTaskSmoker"
entryCriteriaRefs="sentrySmoker" />

<cmmn:sentry id="sentrySmoker">
<cmmn:ifPart>
<cmmn:condition>
<cmmn:body>${application.smoker}</cmmn:body>
</cmmn:condition>
</cmmn:ifPart>
</cmmn:sentry>
<cmmn:humanTask id="humanTaskSmoker" name="adjust risk profile for
smoker" isBlocking="true" camunda:assignee="demo"
camunda:formKey="app:adjust-smoker-risk-profile.jsf" />

Lässt man den Unit-Test laufen, kann man sich den Status der Aktivitäten im Case nach dem Start auf der Konsole anschauen oder grafisch über ein CMMN-Monitoring-Plug-in für Camunda Cockpit, das im Browser laufende Monitoring-Tool der Plattform.

Übersicht der Status
Aktivitätsname Aktivitätstyp Status Bemerkungen
review interview result Human Task Available kann erst nach 'tele-interview' gestartet werden
adjust risk profile for smoker Human Task Available kann nur bei Rauchern gestartet werden
approved Milestone Available kann erst erreicht werden, wenn 'decide on application' mit 'approve' abgeschlossen wird
rejected Milestone Available kann erst erreicht werden, wenn 'decide on application' mit 'reject' abgeschlossen wird
comment from co-underwriter Human Task Enabled kann manuell gestartet werden
tele-Interview with applicant Human Task Enabled kann manuell gestartet werden
doctor information request Process Task Enabled kann manuell gestartet werden
decide on application Human Task Active läuft
Underwriting Case Active gesamte Case Instance läuft ebenfalls


Wird anschließend beispielsweise das "tele-interview" mit dem Kunden durchgeführt und die entsprechende Aufgabe abgeschlossen, ist die Aktivität "review interview result" verfügbar. Sind alle relevanten Aufgaben (es gibt dafür weitere Attribute, die in diesem Artikel nicht weiter betrachtet werden) erledigt, beendet der Prozess die Case-Instanz.

Dies soll als kurzer Einblick in CMMN genügen, bei Interesse lässt sich das gesamte Beispiel herunterladen. Um es benutzen zu können, sollte eine aktuelle JBoss-Distribution von camunda verwendet werden (JBoss wegen der JSF-Oberfläche). Alternativ lässt sich ein CMMN-Modell von der Pike auf selbst erstellen. Dazu steht ein Online-Tutorial zur Verfügung.