Was entscheidet in der SOA Suite (mindestens bis 11.1.1.6) darüber, ob ein BPEL Prozess synchron oder asynchron ausgeführt? Und was darüber, ob dafür eine neue Transaktion geöffnet wird oder nicht?
Intuitiv würde man davon ausgehen, dass das (teilweise) in der WSDL modellierte Message Exchange Pattern (MEP) über die Art der Ausführung entscheidet. Demnach würden beispielsweise Prozesse mit Request und Reply synchron ausgeführt werden und solche, die nur einen Request (One-Way) oder möglicherweise einen späteren Invoke als „asynchrone“ Antwort haben, asynchron. (Letzterer Fall ist aus der WSDL nicht direkt ersichtlich, aber es gibt dort dann i.d.R. einen zweiten Port Type, der auf den Client zutrifft). Nur „“ das MEP ist nicht entscheidend!
In der SOA Suite gibt es dafür eine Property, die für einen BPEL Component in der composite.xml
gesetzt werden kann, und zwar die bpel.config.oneWayDeliveryPolicy
. Mögliche Werte sind:
sync
„“ führt den Prozess synchron aus.async.persist
„“ führt den Prozess asynchron aus; die Message wird dabei in der Datenbank zwischengespeichert.async.cache
„“ führt den Prozess asynchron aus; die Message wird dabei nur im Arbeitsspeicher gehalten. Da dadurch keine Fehlertoleranz gewährleistet werden kann, sollte diese Einstellung nur nach gründlicher Überlegung verwendet werden „“ normalerweise istasync.persist
die bessere Wahl.
In diesem Zusammenhang ist ebenso wichtig, ob der Transaktionskontext vom Aufrufer übernommen wird (z.B. bei Aufrufen aus Adaptern oder anderen BPEL-Prozessen) oder, ob eine eigene Transaktion gestartet wird. Darüber entscheidet die Property bpel.config.transaction
:
required
„“ übernimmt die Transaktion des Aufrufers, sofern vorhanden. Falls nicht, wird eine neue erstellt.requiresNew
„“ es wird immer eine neue Transaktion gestartet.
Diese beiden Einstellungen haben gemeinsam auch Auswirkungen auf das Rollback-Verhalten und die Fault-Propagation. Ab 11.1.1.6 fragt der JDeveloper aktiv nach den Einstellungen für einen neuen BPEL Prozess, da die Standardwerte nur für einen kleinen Teil der Prozesse korrekt sind. Dafür müssen die Einträge von Hand in der composite.xml
eingetragen werden.
Die Details und alle möglichen Kombination beschreibt die offizielle Oracle Dokumentation (http://docs.oracle.com/cd/E23943_01/dev.1111/e10224/soa_transactions.htm) „“ ein absolutes Must-Read für alle BPEL Entwickler!