- From: Ricky Ho <riho@cisco.com>
- Date: Wed, 21 May 2003 21:17:46 -0700
- To: Assaf Arkin <arkin@intalio.com>
- Cc: public-ws-chor@w3.org
Assaf,
>>=====================
>>How do I associate a "scope" with the "context" of the message that I
>>just receive ? (especially when the <receive> is in the middle of the
>>BPEL process).
>
>I don't think you need to write it in the process definition explicitly.
>When the engine recieves a message that would start a new scope it would
>look for the context. If no context is provided it starts a new scope. If
>a context is provided it would start a new scope and register it as a
>participant in the larger context.
There are a couple of issues ....
Lets say in the following process
<process>
<sequence>
....
<receive/>
....
<reply/>
....
<receive/>
....
<reply/>
....
</sequence>
</process>
1) Lets say the first <receive> pass in a transaction context. What is the
"scope of work" ? Between the first request and first reply ? or
everything after the first receive ?
2) Lets say after receiving the first <reply>, the caller want to commit
the transaction. What scope of work has been committed ? Does the caller
wait for this whole process to be completed before the caller's transaction
can commit successfully ?
3) If instead the caller want to cancel the transaction. How does the
process cancel its work ? Where is the compensation handler defined ?
4) What if the second <receive> pass in a different context ? (the only
way to prevent this happening is to use the context itself as the
correlation set)
>So it would work like the transaction attribute requires in an EJB bean.
>Either you start a new transaction if none was started by the caller, or
>you participate in the caller's transaction.
BPEL <Receive> is quite different from the EJB scenario. The EJB doesn't
have a pre-establish transaction context, it either starts a new context or
inherit the caller's context. In EJB, you never run into the situation of
the above question 4.
>For atomic transactions you don't need prepare or commit, you are working
>at a higher level than the code and all that needs to be prepared or
>committed should be done by the engine for you. For BA transactions you
>don't have prepare or commit, every response is an indication that all
>previous steps have been completed (prepared and committed). You do need a
>way to cancel, but this can be done by a fault handler (the terminate
>fault). And you do need a way to compensate and this is done by a
>compensation handler.
I'm talking about BA, not atomic. Effectively, you restrict the choices by
forcing every scope of work must be compensatable.
Lets say I'm an airline company. I don't want to reserve the seat for a
lengthy period and later cancel it when the passenger change his mind. So
my strategy is to only book the seat when the customer commits its
purchase. After that, I don't refund (so not compensatable from the
passenger's perspective).
The original state of the seat is "available". When the passenger invoke
my "TicketBookingService", the seat is marked "potentially-booked". When
the transaction commit successfully, the seat status to be "booked". After
that, it is non-compensatable.
How do I achieve this if I only have the CompensationHandler ?
Rgds, Ricky
Received on Thursday, 22 May 2003 00:17:55 UTC