Atomic Scopes And Processes
---------------------------

                 Key: ODE-396
                 URL: https://issues.apache.org/jira/browse/ODE-396
             Project: ODE
          Issue Type: New Feature
          Components: Axis2 Integration, BPEL Compilation/Parsing, BPEL 
Runtime, JBI Integration
    Affects Versions: 1.2
         Environment: platform-independent
            Reporter: Karthick Sankarachary
             Fix For: 1.3


In general, WS-BPEL processes are susceptible to transient errors that stem 
from faulty service interactions. Most real-world applications make an attempt 
to recover gracefully from such errors by retrying the piece of work that 
failed, taking care to roll it back first. If the probability of the error 
reoccurring is low, then chances are that the application will be able to move 
forward. To facilitate this type of behavior in WS-BPEL, we introduce the 
notion of atomicity that (a) guarantees all-or-nothing semantics (b) induces 
rollback-and-retry on transient errors and (c) induces rollback-and-fault on 
persistent errors.

We define atomicity in terms of the "atomic" extension attribute (marked 
"yes"), which may be applied on the following WS-BPEL elements:
a) The <process> element, which denotes the top-most unit-of-work, and has an 
implicit scope of its own. If the process starts with an inbound message 
activity, then in case of a rollback, the process will block until a new 
message is received.
b) The <scope> element, which denotes a fine-grained unit-of-work and provides 
the context for its enclosed activity. If the scope starts with an inbound 
message activity, then in case of a rollback, the scope will block until a new 
message is received.
c) The <onEvent> element, which denotes a concurrent unit-of-work and is 
triggered by an inbound message. Note that its atomicity is independent of that 
of its enclosing scope. Also, while the child within an event handler is always 
a <scope> activity, making that atomic will not cause the process to block 
until a new event arrives.

Note that in order to achieve the all-or-nothing behavior, we must begin, 
commit or rollback a JTA global transaction when the execution of an atomic 
element starts, succeeds or fails, respectively. In addition, we implicitly 
commit the process when it hits a blocking activity, such as a receive. 
Consequently, we disallow the use of a <receive> activity anywhere inside an 
atomic activity, except as its first basic activity. A healthy side-effect of 
this constraint is that it frees us from deadlocks that might otherwise arise 
due to circular service interactions.

The retry logic of atomic activities may be configured using the following two 
configuration properties:
a) scopes.atomic.retry.count: This number indicates the number of times the 
atomic activity will be "retried" before it gives up, which defaults to 3. 
Specifically, it may be executed at most one more time than this count. 
Strictly speaking, the first attempt at executing the atomic activity is not 
considered to be a "retry".
b) scopes.atomic.retry.delay: This number indicates the number of seconds the 
process will wait before "retrying" a previously failed atomic activity, which 
defaults to one minute.
If the atomic activity successfully completes during its first try or one of 
its subsequent retries, the process will proceed to the following activity, as 
it normally would have. If the atomic activity repeatedly fails and the allowed 
number of retries is exceeded (i.e., the error is no longer transient, but 
rather persistent), it will in turn throw a ode:scopeRollback fault, which may 
be caught and handled by one of its enclosing scopes (or not).

Let us now discuss the rollback aspect of an atomic activity. In the event of a 
failure, before we retry it, we will revert the state of the process back to 
the point when it was just about to commence execution. As a result, we discard 
any change to the process state caused by copy operation assignments, message 
activity variable and correlation initialization, link status evaluations, and 
so on. Furthermore, one-way messages meant to be sent on success are discarded 
and two-way messages already sent have the consumed service rolled back. 
Speaking of two-way messages, we limit the scope of our initial implementation 
to message exchanges with processes and services that co-exist in the same 
server (node). Supporting atomicity across external services would require the 
use of a web service transaction protocol such as WS-AtomicTransaction, but 
that standard is neither specified nor implemented fully.

For more details, please refer to 
http://ode.apache.org/atomic-scopes-extension-for-bpel.html.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to