jBPM JBoss jBPM: Graphentheorie für Geschäftsprozesse Der Boss im Orchester von adam bien Speaker @ Der Begriff Geschäftsprozess taucht immer wieder in der Analysephase der Anwendung auf. Je konkreter es wird, desto weniger beschäftigt man sich mit den wichtigen Abläufen innerhalb eines Unternehmens. Manchmal bleibt es sogar lediglich bei Worthülsen, welche zwar oft verwendet werden, aber nur wenige Auswirkungen auf die Softwareentwicklung letztendlich haben. Workflow Engines sollten dies ändern und dafür sorgen, dass die Fachlichkeit durchgängig und flexibel realisiert wird. Das JBossProjekt jBPM ist eine Open-Source-Realisierung einer Workflow Engine, welche aber auch außerhalb eines Java EE-Containers ausgeführt werden kann. Worflow Engines werden insbesondere aufgrund der gewünschten Flexibilität und Anpassbarkeit eingesetzt. Die Hoffnung liegt in der flexiblen Zusammenstellung der einzelnen Aktivitäten und somit in der Mi­ nimierung derWartung undÄnderungskos­ ten nach der Produktionseinführung des Systems. Insb. in den heutigen SOA-Zeiten erlebt man das Revival von konfigurativer Nacheinanderschaltung von Aktivitäten eines Services. Dabei benutzt man nur sel­ ten den etwas angestaubten Begriff Work­ flow Engine und spricht eher von Orches­ trierung der Services. In der Praxis wird der Einsatz von Workflow Engines meistens von strate­ gischen „Beratern“, getrieben, die mit auf­wendigen Untersuchungen heraus­ finden, dass der Einsatz von Workflow Engines Kosten sparen könnte. Diese eher PowerPoint-getriebene Vorgehenswei­ se (kurz PPGV :-)), führt nur selten zum gewünschten Ergebnis, da viele Anwen­ dungen bereits existieren und die flexible Orchestrierung technisch schwer reali­ sierbar oder oft gar nicht möglich ist.Allein die serielle Ausführung von unabhängigen Services innerhalb einer Transaktions­ klammer ist sportlicher, als man denkt – spätestens jetzt werden „Two phase com­ mit“-Protokolle wie z.B. XA benötigt. Andererseits gibt es auch Anwen­ dungsfälle, die sich mit Java EE nur schwer www.javamagazin.de realisieren lassen. Asynchrone Vorgänge lassen sich noch relativ einfach abbilden. Dafür steht ja JMS zur Verfügung. Das Warten auf externe Ereignisse ist deutlich schwieriger durchführbar. Die Realisie­ rung von Thread-Sychronisierung und Blockierung im EJB-Container ist gar nicht erst erlaubt. Der Servlet-Container erlaubt zwar dies, aber wahrscheinlich nur, weil man es vergessen hat zu verbie­ ten – sowohl der Web-Container als auch der EJB-Container laufen ja meistens in einer JVM-Instanz ab. Neben dem be­ wussten Warten auf ein bestimmtes Ereig­ nis gibt es auch noch Fälle, die ungewollt den Ablauf blockieren. Dies schlägt sich nicht nur in der Zufriedenheit des Benut­ zers negativ nieder, sondern kann auch ungewollte Seiteneffekte wie z.B. Dead­ locks, leere Thread-Pools und Transak­ tions-Time-outs verursachen. Potenziell sind alle Vorgänge bzw. Methoden, die länger als zwei bis zehn Sekunden dauern, zunächst verdächtig und sollten auf je­ den Fall auf einer „Blacklist“ landen. Ein späteres Review solcher Methoden kann auch Auswirkungen auf die Fachlichkeit der Anwendung haben. Solche Methoden sind meistens für die Koordination von feineren, transaktionalen Aktivitäten zu­ ständig und gehören somit oft einer Faca­ de an. Der Einsatz einer Workflow Engine könnte das Problem beheben. Diese liefert bereits Lösungen für das „Warten“ auf ex­ terne Ereignisse und kann auch potenziell die Zuständigkeiten einer hart verdrahte­ ten Fassade übernehmen. Im Gegensatz zu Java wurden Worflow Engines für das „Warten“ entwickelt. Im Gegensatz zu PPGV bringt in diesem Fall eine Worflow Engine wie z.B. jBPM echte Vorteile mit sich. Der Umgang mit Wait-States, Verar­ beitung von externen Ereignissen, Persis­ tenz, Auditing, Zuweisung von Aufgaben zu Akteuren wird bereits out of the box unterstützt. Die Vision Die Idee des jBPM-Projekts ist die Tren­ nung der Prozessdefinition von der tat­ sächlichen Realisierung der einzelnen Aktivitäten. Das erlaubt die Trennung der Zuständigkeiten des Prozess-Desi­ gners und Entwicklers. Obwohl in der Praxis sich dabei oft um eine Person han­ deln wird, erhöht die Trennung der Fach­ lichkeit von der Technik auf jeden Fall die Wartbarkeit des Codes. Der Prozess wird mithilfe eines Aktivitätsdiagramms modelliert. Dieser besteht ja aus Kno­ ten und den Übergängen zwischen den Knoten. Man kann sich also die jBPM En­gine als eine VM für die Ausführung von Aktivitätsdiagrammen vorstellen. Ein Aktivitätsdiagramm entspricht einer Prozessdefinition. Bei der Ausführung 5.2006 91 jBPM der Prozessdefinition entsteht eine Pro­ zessinstanz. Nur die Zustände dieser In­ stanz werden nach der Ausführung eines Knotens persistiert. Alle Knoten einer Prozessinstanz können auf die gleichen Daten zugreifen. Das kann man sich wie­ derum als eine globale java.util.Map, also ein Singleton, vorstellen. Die einzelnen Knoten können über diese Map miteinan­ der kommunizieren. jBPM berücksichtigt nicht nur Java-Aktvitäten (Methodenauf­ rufe), sondern auch externe Tasks, welche von bestimmten Personen (Rollen) ab­ gearbeitet werden müssen. Insbesondere dieses Feature setzt ein effizientes Warten auf die Benutzereingaben voraus. Ein Ausführungspfad innerhalb eines Systems wird Token genannt. Gleichzeitig hält ein Token auch die Referenz auf den aktuellen Knoten. Die Kommunikation zwischen Systemen oder die Ausführung von menschlichen Tasks kann jedoch die Ausführung des Tokens unterbrechen. Dadurch ergeben sich automatisch War­ tezustände. Ein Wartezustand kann durch ein Ereignis, ein so genanntes Signal, be­ endet werden. Das ist nicht nur auf die Wartezustände beschränkt, im Gegenteil – ein Signal verursacht den Übergang von einem Zustand (Knoten) in einen anderen. Falls von einem Knoten lediglich ein ein­ ziger Übergang ausgeht, reicht lediglich das Auftreten eines Signals für den Kno­ tenwechsel. Bei mehreren Möglichkeiten muss der Pfad bei dem Auftreten des Sig­ nals mitgegeben werden. Dabei handelt es sich um einen einfachen String. Bei der Ausführung eines Knotens (Node) kann auch Geschäftslogik ausge­ führt werden. Neben der Durchführung von Geschäftslogik ist ein Node auch für das Warten oder die Übergabe der Kon­ trolle an andere Knoten zuständig. Nach der jBPM-Philosophie sollte jedoch der Prozess von der technischen Realisierung streng getrennt werden. Diese Zustän­ digkeit erfüllen so genannte Actions. Es handelt sich hierbei um Delegates, welche indirekt einen ActionHandler kennen. Bisher hat sich die Workflow Engine mit sich selbst beschäftigt. Nun kommen die Entwickler ins Spiel. Eine konkrete Reali­ sierung des Interfaces ActionHandler aus dem Package org.jbpm.graph.def wird entsprechend ausgeführt. 92 5.2006 public interface ActionHandler extends Serializable { void execute( ExecutionContext executionContext ) throws Exception; } Der ActionHandler kann durchaus mit dem Command Pattern (GoF) verglichen werden. Ähnlich zu den Message Driven Beans sollte man auch hier lediglich zu an­ deren Geschäftskomponenten verweisen und nicht die fachlichen Vorgänge kom­ plett in der Methode execute ausimple­ mentieren. Auch hier gilt: Trennung der jBPM-Technik von der Realisierung der Fachlichkeit :-). Die Technik Die Elemente der beschriebenen Vision wurden direkt auf den jBPM-Sourcecode abgebildet. Die bisher beschriebenen Be­ griffe wie z.B. Node, Token, Transition usw. findet man tatsächlich in der Imple­ mentierung der jBPM als Klassen wieder. Nodes Nodes repräsentieren die Bubbles eines Aktivitätsdiagramms. Nodes werden mit­ hilfe von Transitionen verbunden. jBPM bringt bereits einige Node-Implementie­ rungen gleich mit: •State: Ist die einfachste Sorte der Nodes. Ein State wartet einfach auf einen Auf­ruf der Methode signal() der Pro­ cessInstance. Dabei kann es sich um ein externes Ereignis handeln. Ein State ist einfach „leer“, d.h., hier wird keine Ge­ schäftslogik ausgeführt. •Node: Obwohl ein Node die Superklas­ se von State ist, kann sie wesentlich mehr als der State selbst, d.h., State überschat­ tet die Funktionalität der Klasse Node und tut selber nicht sehr viel. Das ist aus der objektorientierten Sicht zumindest als bedenklich einzustufen … Für die Fun­­ktionalität bringt allerdings diese Tatsache keine wesentlichen Nachteile mit sich. Ein Node wartet nicht. Im Ge­ genteil, nach der „Ausführung“ eines Node wird dieser automatisch über die Default-Transition (d.h. bei einer einzigen ausgehenden Verbindung) verlassen. Somit erscheint der Einsatz von Nodes zunächst als nicht beson­ ders sinnvoll. Allerdings verhalten sich die Nodes nur so, wenn diese über noch keinen ActionHandler verfügen. Die Hauptaufgabe von Nodes ist die indi­ rekte Ausführung von Geschäftslogik. Diese wird jedoch nicht durch eine Un­ terklasse von org.jbpm.graph.def.Node realisiert, sondern vielmehr von einer konkreten ActionHandler-Instanz be­ reitgestellt. Bei dieser Instanz handelt es sich um eine so genannte Node Action, also einen Delegate, welcher die notwen­ dige Logik mit sich bringt. Bei der As­ soziation einer Node Action mit einem Node, übergibt der Node die Kontrolle an den konkreten ActionHandler, d.h., der ActionHandler ist nun für die Aus­ führung des nächsten Übergangs zu­ ständig. Der ActionHandler kann ent­ weder die Ausführung der Default- oder einer beliebigen anderen Transition an­ stoßen. Der ActionHandler kann somit auch den weiteren Ausführungspfad des Prozesses beeinflussen. •Decision: Entscheidungen können von ActionHandlern eines Node getrof­ fen werden. Allerdings wird diese Ent­ scheidung „hart kodiert“. Ferner ist die Entscheidung lediglich im Sourcecode sichtbar und steht dem Prozessmodel­ lierer nicht zur Verfügung. Die Decision kann man vielmehr als die Vorgabe des Prozessmodellierers an den Entwick­ ler verstehen. Decisions sollten immer verwendet werden, wenn sie für die Fachlichkeit des Geschäftsprozesses eine Rolle spielen. Technische Entschei­ dungen dagegen, können durchaus in den ActionHandlern getroffen werden – diese sind für den Modellierer eher un­ interessant. Ähnlich zu dem einfachen Node wird auch hier keine Unterklasse der Decision gebildet. Vielmehr wird diese Zuständigkeit wieder an einen ex­ ternen DecisionHandler delegiert. public class SpecialDecisionHandler implements DecisionHandler { public String decide(ExecutionContext execution Context) throws Exception { return “special_transition_name“; } } •Auch diese Entscheidungslogik sollte nicht direkt in der Implementierung des www.javamagazin.de jBPM Interfaces realisiert werden. Stattdes­ sen sollte man an dieser Stelle lediglich bestehende Geschäftskomponenten bzw. Services ausführen und entspre­ chend interpretieren. Das Ergebnis der Entscheidungsfindung ist ein einfacher ­String. Dieser sollte mit einer ausge­ henden Transition des aktuellen Deci­ sion-Knotens übereinstimmen. •TaskNode: Nun der TaskNode dient der Interaktion mit einer externen Rolle. Der TaskNode blockiert solange, bis alle zugewiesenen Tasks von der zuständigen Rolle abgearbeitet werden. Die Abarbei­ tung der Tasks führt zu einem neuen Si­ gnal, welcher letztendlich das Verlassen des TaskNode bedeuten könnte (es kön­ nen ja noch weitere nicht abgearbeitete Tasks dies verhindern …). Ein TaskNo­ de ist also ein besonders hartnäckiger StateNode. Aus den Tasks entstehen Task-Instanzen, die von den Akteuren (Actors) abgearbeitet werden. •Fork: Auch Fork ist ein Node. Die Zu­ ständigkeit des Fork Node ist klar defi­ niert: die Parallelisierung des Prozesses. Der Fork Node transformiert eine einge­ hende Transition in zwei ausgehenden. Die Funktionalität deckt sich mit den Forks aus den Aktivitätsdiagrammen überein. •Join: Der Join Node ist das Gegenteil eines Fork Node. Dieser konvertiert die zwei eingehenden Transitionen wie­ der in eine ausgehende. Ein Join Node wartet so lange, bis alle parallelisierten, eingehenden Transitionen ankommen. Erst dann wird der Join Node über die Default-Transition verlassen. Somit ist ein Join Node konzeptionell mit dem aus UML bekannten Join-Bar absolut vergleichbar Event Actions und Node Actions zu un­ terscheiden. Event Actions können an jedem Node angemeldet werden. Dabei muss der entsprechende Zustandsüber­ gang wie z.B. After Signal, Before Signal, Node Enter oder Node Leave angegeben werden. Die Action wird dann beim Auf­ treten des entsprechenden Ereignisses ausgeführt. Da die Event Action eigent­ lich nur von außen die Transi­tionen be­obachten, dürfen diese den Ausfüh­ rungspfad nicht beeinflussen. Anders sieht es bei den Node Actions aus. Diese werden insbesondere bei den Nodes, also der Superklasse, angewendet. Node Ac­ tions repräsentieren die technische Um­ setzung der Nodes und können durchaus die weitere Ausführung des Prozesses be­ einflussen. Node Actions können sogar die Aufgaben der Decision Nodes über­ nehmen. Scheduler Bisher mussten die einzelnen Knoten von einem externen Actor getrieben werden. Die Workflow Engine reagiert lediglich auf die externen Ereignisse wie z.B. Be­ nutzereingaben oder Nachrichten von an­ deren Systemen. Bisher wurde allerdings ein wichtiger Actor – der Timer – nicht berücksichtigt. Ein Timer kann zu jedem State­ deklarativ zugeordnet werden. Da­ bei ist explizite Erzeugung und Zerstörung eines Timer beim Auftreten der Events No­ de Enter und Node Leave möglich. Bei der Erzeugung eines Timer können sein Timeout und die Wiederholungsanzahl ange­ geben werden. Nach dem Time-out kann eine gewählte Aktion ausgeführt werden. Falls konfiguriert, kann auch die aktuelle Node mithilfe einer angegebenen Transiti­ on verlassen werden. Timer werden aktiv, wenn der aktuelle Knoten nicht vor dem Ablauf des Timers bereits verlassen wird. Timer sind also sehr hilfreich für die Realisierung von Time-outs (zum Beispiel bei der Überwachung der Benutzereinga­ ben) oder für die Implementierung von automatischen Zustandsübergängen. Die Timer werden mithilfe eines Sche­ duler ausgeführt. Dieser braucht für die asynchrone Ausführung der Timer einen Thread. Dies ist aber in einem EJB-Con­ tainer nicht erlaubt. Um das Deployment in einen Application Server dennoch zu ermöglichen, wird ein spezielles Servlet bereitgestellt. Das Servlet org.jbpm.web. JbpmThreadsServlet ist lediglich für die Instanziierung des Schedulers und Star­ ten eines Thread zuständig. Nun wird die jBPM Engine im Web-Container aus­ geführt, die ActionHandler-Implemen­ tierungen können aber bei Bedarf auch Remote auf die entsprechenden ServiceImplementierungen im EJB-Container zugreifen. Auditing/Activity Monitoring Die jBPM Engine bringt einen eigenen Log­ging-Service mit. Dabei handelt es sich jedoch keineswegs um eine weitere Konkurrenz zu den Frameworks log4j oder java.util.logging. Im Gegenteil – bei dem LoggingService handelt es sich um systematisches Monitoring der jBPM-Vorgänge. Der org.jbpm.logging. Action Nodes werden insbesondere von den Pro­ zessmodellierern verwendet. Dabei in­ teressiert weniger die Realisierung dieser Prozessvorgaben. Jedem Knoten können sog. Actions zugeordnet werden. Jede Ac­ tion kennt einen ActionHandler, welcher durchaus mit dem bekannten Interface java.awt.event.ActionEvent verglichen werden kann. ActionHandler können die Ausführung der Geschäftslogik an­ stoßen. Allerdings ist hierbei zwischen www.javamagazin.de Anzeige 5.2006 93 jBPM stand des Prozesses, welcher tabellenartig (ähnlich zu einer Map) abgelegt wird. Für den Zugriff auf die Prozessvariablen wird jedoch nicht direkt mit der ContextSes­ sion, sondern vielmehr mit der Context­ Instance gearbeitet. ProcessInstance processInstance = new ProcessInstance(processDefinition); ContextInstance contextInstance = processInstance.getContextInstance(); contextInstance.setVariable(“key“, “value“); contextInstance.setVariable(“date“, new Date()); Abb. 1: Der jBPM-Designer log.LoggingService wird bei Zustands­ übergängen, Node Events, Ausführung von Timern usw. für die Persistierung des „fachlichen“ Zustands verwendet. Standardmäßig verwendet der Logging­ Service für die Persistierung der LogEinträge Hibernate. Die Reihenfolge der Einträge bleibt natürlich erhalten, es wird das Datum, Token, Actor-ID bereits von der abstrakten Klasse org.jbpm.log­ ging.log.ProcessLog vorgegeben. Von dieser abstrakten Klasse erben andere, spezialisierte Logs wie z.B. NodeLog, welche noch zusätzliche Informationen (bei NodeLog die Dauer der Ausführung, den Knoten selbst, das Datum/Uhrzeit des Eintritts und des Austritts des Kno­ tens) mit sich bringen. Mit diesem Ansatz werden keine flachen Dateien, sondern vielmehr objektorientierte Strukturen weg­geschrieben. Dabei werden nicht nur die zusätzliche Information, sondern auch die korrespondierenden Instanzen festgehalten. Eine objektorientierte Sicht auf die Logs öffnet ganz neue Möglich­ keiten der Auswertung. Der Zugriff auf die Daten kann sowohl über die bereits bestehenden Hibernate-Entitäten als 94 5.2006 auch für z.B. Report-Zwecke direkt über JDBC wie z.B. DAOs erfolgen. Persistenz jBPM verwendet nicht nur für die Persis­ tierung der Logs das Hibernate-Frame­ work, vielmehr handelt es sich hier um ein durchgängiges Konzept. Für alle bis­her vorgestellten Entitäten wie zum Beispiel Node, State, Token, Timer, Actor usw. existiert ein Hibernate-Mapping, somit können automatisch alle Entitäten persis­ tiert werden. An dieser Stelle merkt man die Vorzüge der „transparenten“ Persis­ tenz. Die objektorientierten Strukturen können ohne umständliche Konvertie­ rungen direkt und transparent am Ende der Transaktion in die Datenbank wegge­ schrieben werden. Die Persistierung der Objekte wurde fachlich in unterschied­ liche Bereiche getrennt. Prozessrelevante Entitäten werden mithilfe der GraphSes­ sion persistiert und auch geladen. Es kön­ nen sogar zur Laufzeit der Engine neue Prozessdefinitionen persistiert werden. Die ContextSession ist dagegen für die Persistierung der Prozessvariablen zu­ ständig. Dabei handelt es sich um den Zu­ Es können zunächst alle Java-Datentypen als Variablen abgespeichert werden. Al­ lerdings wird hier ein Objekt erwartet, sodass man entweder die Verpackung der elementaren Datentypen in die Wrapper selbst übernimmt oder dies an das Java 5 Autoboxing delegiert. Zusätzlich können noch alle java.io.Serializable-Instanzen gespeichert werden, bei ausgefallenen An­ forderungen müssen jedoch eigene Imple­ mentierungen des org.jbpm.context.exe. Converter diese Aufgabe übernehmen. Die Konvertierung und Rückkonvertie­ rung einer nicht persistenten Instanz in eine persistente Repräsentation muss von der Implementierung dieses Interfaces be­ reitgestellt werden. Es existiert noch eine Reihe von wei­ teren Sessions, eine spezielle LoggingSes­ sion, TaskMgmtSession, SchedulerSes­ sion usw. Die hier vorgestellten Sessions umhüllen eine Hibernate-Session und lassen sich gut mit dem DAO Pattern ver­ gleichen. Dabei erhält nicht jedes DAO eine neue Hibernate-Instanz, sondern vielmehr einen bestehenden Singleton. Diese Aufgabe übernimmt der Persistence­ Service, welche eine Facade zu der jBPMPersistenz realisiert. Die thematische Gruppierung der Sessions erleichtert den Umgang mit der Persistenz. Die Tool-Unterstützung jBPM kommt mit einem eigenen Desi­ gner-Plug-in, welches aber getrennt he­ runtergeladen werden muss. Nach der Eclipse-Installation (Eclipse 3.1.1 wird bereits unterstützt), kann mit dem Pro­ jekt-Wizard ein jBPM Process Project er­ www.javamagazin.de jBPM stellt werden. Das wird auch empfohlen, da dadurch ein einfacher Prozess mit funk­ tionierendem JUnit-Test erzeugt wird. Die Installation des Designers verläuft problemlos – es werden auch keine Libra­ ries oder Projekte wie z.B. GEF vorausge­ setzt. Der jBPM-Designer erlaubt visuelle Modellierung von Prozessen. Beim Spei­ chern erfolgt die Synchronisierung mit der Datei prozessdefinition.xml. Der Designer ist zwar komfortabel, aber unterstützt noch nicht alle Features wie z.B. Timer. Entwickler werden wahrscheinlich nach wenigen Klicks die XML-Datei direkt edi­ tieren, die Prozess-Designer werden sich sträuben, ihre geliebten „Bubble-Tools“ aufzugeben, um mit einem Eclipse-Plug-in weiterzumodellieren. Hier liegt das Pro­ blem. Das Diagramm sieht zwar wie ein stereotypisiertes Aktivitätsdiagramm aus, das Ergebnis wird jedoch direkt in einer JPDL-Datei abgelegt (die JBoss-Prozess­ definition). Somit können Aktivitätsdia­ gramme aus bestehenden Modellen nicht wieder verwendet werden. Andererseits kann man so den jBPM-Designer ohne ein UML-Tool verwenden. Da das JPDL-Schema einfach ist, kann man es auch generieren. Dies wäre insbe­ sondere für Projekte sinnvoll, in denen UML-Werkzeuge bereits für die Modellie­ rung der Fachlichkeit verwendet werden. Die nichtfunktionalen Qualitäten Neben den rein funktionalen Anforde­ rungen sind auch die nichtfunktionalen Anforderungen der jBPM für den reellen Einsatz interessant: •Skalierbarkeit/Cluster-Fähigkeit: Die Prozessinstanzen der jBPM Engine sind durchaus zustandsbehaftet. Neben den reinen Informationen über den aktuellen Prozesszustand (z.B. die Referenz auf den aktuellen Knoten) können ja auch nahezu beliebige Benutzerdaten mitver­ waltet werden. Umso interessanter ist die Frage, ob so ein Ansatz überhaupt skalieren kann. Die Zustände der En­ gine werden von Hibernate verwaltet. Der Zeitpunkt der Persistierung des Zu­ stands kann mithilfe von Transaktionen bestimmt werden. Die Skalierbarkeit der jBPM Engine wird also direkt von der jeweiligen Transaktionsstrategie be­ einflusst. Nach dem Commit der Trans­ aktion ist der ganze Zustand der Engine persistent. Da eine Prozessinstanz den ganzen Zustand in einer zentralen Da­ tenbank verwaltet, ist der Ansatz auch clusterfähig, da zwischen den atomaren Prozessschritten die Cluster-Instanzen sogar gewechselt werden können. Die Cluster-Fähigkeit und der Grad der Ska­ lierbarkeit der jBPM Engine sind mit ei­ ner Stateless Session Bean vergleichbar, welche innerhalb eines Methodenauf­ rufs auf Hibernate-Entitäten zugreift. Die Cluster-Fähigkeit der jBPM könnte durch den Scheduler gefährdet werden. Dieser wird ja mithilfe eines Servlets implementiert, welches in der Initia­ lisierungsphase einen Thread startet. Der Thread übernimmt aber lediglich die Rolle eines Taktgebers. Da der Aus­ führungsplan auch in der Datenbank persistiert wird, ist auch dies unkritisch – im Cluster-Betrieb wird lediglich öfter auf die Jobtabelle zugegriffen. Dennoch sollte man im Cluster-Betrieb vorsichtig sein. In der Standard-Konfiguration ist der Second-Level-Cache eingeschal­ tet. Ferner könnten sich potenziell die Cluster-Knoten gegenseitig die Daten­ Anzeige bank überschreiben. Man sollte hier unbedingt die Konsistenz des Prozess­ zustands mit pessimistischen (z.B. „se­ lect for update“, was aber nur selten empfohlen werden kann) oder optimis­ tischen Locks sicherstellen. Es ist aber nichts Ungewöhnliches – lediglich ein Standardproblem beim Einsatz von OR-Frameworks mit eingeschaltetem Cache im Clusterbetrieb … •Anpassbarkeit/Deployment: jBPM wird in JBoss bevorzugt als ein SAR oder WAR deployt. Bei anderen Ap­ plication-Servern kann man sich für ein WAR oder EJB-JAR entscheiden, wobei die Ausführung des Scheduler im EJB-Container zu Problemen füh­ ren kann. Neben dem eher statischen Deployment können zur Laufzeit neue Prozessdefinitionen installiert werden. Dies funktioniert sogar im laufenden Betrieb sehr gut. Getrennte Classloa­ der (jede Prozessinstanz wird in einem eigenen Classloader ausgeführt) er­ möglichen sogar gleichzeitige Ausfüh­ rung von unterschiedlichen Versionen einer Prozessdefinition. Ferner können sogar neue Prozessdefinitionen in zum Beispiel ActionHandlern erzeugt wer­ den. Die jBPM-Architektur macht einen durchdachten und klaren Eindruck. Die Trennung der Definition von der Instanz (beispielsweise ProcessDefinti­ on, ProcessInstance) erlaubt eine hohe Erweiterbarkeit. Der Kern der Engi­ ne wurde in unterschiedliche Module partitioniert, wobei lediglich das Pro­ zess-Modul unbedingt erforderlich ist, alle anderen Module sind optional. Für typische BPM-Anwendungsfälle wird eine Erweiterung der jBPM jedoch nicht notwendig sein, im Gegenteil meistens jBPM müssen lediglich „Prozess-Listener“ implementiert werden. •Konformität: Der Geschäftsprozess kann zwar auch zur Laufzeit der Anwen­ dung definiert werden, im Normalfall wird aber solche hohe Flexibilität nicht benötigt. Der Geschäftsprozess wird zu diesem Zweck in einer XML-Datei definiert. Die Java Process Definition Language (JPDL 3.1) ist zwar proprie­ tär, dafür aber sehr einfach aufgebaut. Die hier beschriebenen Konzepte bzw. Entitäten werden direkt auf XML Tags abgebildet. Dies erhöht die Wartbarkeit und erleichtert auch ggf. die Generie­ rung der Prozessdefinition. Es existiert auch eine BPEL-Erweiterung, allerdings erst im Alpha-Status. Im Gegensatz zu den anderen Modulen wird die BPELErweiterung mit einer „Custom“-Li­ zenz vertrieben. Somit sollte man sich im kommerziellen Umfeld erkundigen, was das konkret bedeutet. Alle ande­ ren Module sind mit der LGPL-Lizenz erhältlich, was den kommerziellen Ein­ satz uneingeschränkt erlaubt. Auch bei reinen Rich-Anwendungen muss leider immer ein WAR mitdeployt werden. Der Scheduler benötigt einen Thread, welcher ja im EJB-Container nicht ge­ startet werden kann. Abhilfe könnte hier eine MBean oder eine Timer Bean schaffen – diese könnte die Zeitgebung des Scheduler übernehmen. Fazit jBPM macht einen sehr guten Eindruck.Al­ lerdings war die Qualität der JBPM Engine bereits vor der Übernahme durch JBoss Inc. recht hoch. Für Einsteiger ist besonders das Starter-Kit zu empfehlen. Hierbei handelt es sich um einen vorkonfigurierten JBoss 3.0.2 mit einigen Beispielprojekten, eine vorinitialisierte HSQL-DB, Schemas für die gängige Datenbanken und eine unge­ wöhnlich gute Dokumentation. Somit ist jBPM auf jeden Fall einsetzbar. Man sollte jedoch SOA, Orchestrierung, Choreogra­ phie nur dort einsetzen, wo es fachlich tat­ sächlich auch sinnvoll ist. Die meisten ser­ verseitigen Anwendungen kommen auch hervorragend ohne eine Workflow Engine aus. Andererseits lassen sich mit jBPM lang laufende Transaktionen,Time-outs, Benut­ Anzeige zerwechsel oder Auditing einfach und ele­ gant lösen. Bei allen Buzzwords und Hypes darf man die funktionalen Anforderungen des Kunden nie vergessen. Zunächst die Fachlichkeit, dann die Technik … Wie „Professional“ der Sourcecode von jBPM tatsächlich ist, merkt man nach einem kurzen Review sofort – er ist so klar und verständlich, dass man ihn nicht mit Javadoc-Kommentaren verunreinigen möchte :-). Adam Bien arbeitet als freiberuflicher Berater und Dozent im Enterprise-Java-Bereich. Seine praktische Erfahrung stammt aus seiner Mitarbeit an vielen Java- und Java EE-Projekten, in denen er als Architekt und Softwareentwickler tätig ist. Er entwickelt bereits seit JDK 1.0 mit Java und hat die Bücher „Enterprise Java Frameworks“, „J2EE Patterns“, „J2EE HotSpots“ und „Struts“ sowie zahlreiche Fachartikel zur verteilten Java-Programmierung verfasst. Adam Bien ist BEA Technical Director, Mitglied des Advisory Board der JAX in Frankfurt und Expert Group Member des Java Community Process (JCP). Momentan beschäftigt er sich mit der Model Driven Architecture (MDA), EAI-Komponentenarchitekturen für Java EE und .NET und einigen Buchprojekten. Links [1]jbpm.org [2]www.adam-bien.com