Business Process and Data Transformation Language Reference
Provide compensation handlers, each of which performs a sequence of activities to undo a previous action.
<scope> <throw fault='"BuyersRegret"'/> <faulthandlers> <catch fault='"BuyersRegret"'> <compensate target="RestoreBalance"/> </catch> </faulthandlers> <compensationhandlers> <compensationhandler name="RestoreBalance"> <assign property='context.MyBalance' value='context.MyBalance+1'/> </compensationhandler> </compensationhandlers> </scope>
||Zero or more <compensationhandler> elements may appear inside the <compensationhandlers> container. Each <compensationhandler> element contains a specific sequence of BPL activities that undo a previous action.
In business process management, it is often necessary to reverse some segment of logic. This convention is known as compensation. The ruling principle is that if the business process does something, it must be able to undo it. That is, if a failure occurs, the business process must be able to compensate by undoing the action that failed. You need to be able to unroll all of the actions from that failure point back to the beginning, as if the problem action never occurred. BPL enables this with a mechanism called a compensation handler.
BPL <compensationhandler> blocks are somewhat like subroutines, but they do not provide a generalized subroutine mechanism. You can call them, but only
from <faulthandler> blocks, and only
within the same <scope> as the <compensationhandler> block. The <compensate> element invokes a <compensationhandler> block by specifying its name as a target. Extra quotes are not
needed for this syntax:
Compensation handlers are only useful if you can
undo the actions already performed. For example, if you transfer money into the wrong account, you can transfer it back again, but there are some actions that cannot be neatly undone. You must plan compensation handlers accordingly, and also organize them according to how far you want to roll things back.
It is not possible to reverse the order of <compensationhandlers> and <faulthandlers>
. If both blocks are provided, <compensationhandlers> must appear first and <faulthandlers> second.