这是一个很直接的业务过程,很明显的展示了BPEL的强大,达到了为我们的核心Web services编排不同调用场景的目的。现在,让我们来看看实际的BPEL-XML语法。
<?xml version="1.0" encoding="UTF-8"?>
<process name="loanApprovalProcess" suppressJoinFailure="yes"
targetNamespace="http://acme.com/loanprocessing"
xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:apns="http://tempuri.org/services/loanapprover"
xmlns:asns="http://tempuri.org/services/loanassessor"
xmlns:bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:lns="http://loans.org/wsdl/loan-approval" xmlns:loandef="http://tempuri.org/services/loandefinitions"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<partnerLinks>
<partnerLink myRole="approver" name="customer" partnerLinkType="lns:loanApprovalLinkType"/>
<partnerLink name="approver" partnerLinkType="lns:loanApprovalLinkType" partnerRole="approver"/>
<partnerLink name="assessor" partnerLinkType="lns:riskAssessmentLinkType" partnerRole="assessor"/>
</partnerLinks>
<variables>
<variable messageType="loandef:creditInformationMessage" name="request"/>
<variable messageType="asns:riskAssessmentMessage" name="riskAssessment"/>
<variable messageType="apns:approvalMessage" name="approvalInfo"/>
<variable messageType="loandef:loanRequestErrorMessage" name="error"/>
</variables>
<faultHandlers>
<catch faultName="apns:loanProcessFault" faultVariable="error">
<reply faultName="apns:loanProcessFault" operation="approve" partnerLink="customer"
portType="apns:loanApprovalPT" variable="error"/>
</catch>
</faultHandlers>
<flow>
<links>
<link name="receive-to-approval"/>
<link name="receive-to-assess"/>
<link name="approval-to-reply"/>
<link name="assess-to-setMessage"/>
<link name="assess-to-approval"/>
<link name="setMessage-to-reply"/>
</links>
<receive createInstance="yes" name="receive1" operation="approve" partnerLink="customer"
portType="apns:loanApprovalPT" variable="request">
<source linkName="receive-to-approval" transitionCondition="bpws:getVariableData('request',
'amount')>=10000"/>
<source linkName="receive-to-assess" transitionCondition="bpws:getVariableData('request',
'amount')<10000"/>
</receive>
<invoke inputVariable="request" name="invokeapprover" operation="approve"
outputVariable="approvalInfo" partnerLink="approver"
portType="apns:loanApprovalPT">
<target linkName="receive-to-approval"/>
<target linkName="assess-to-approval"/>
<source linkName="approval-to-reply"/>
</invoke>
<invoke inputVariable="request" name="invokeAssessor" operation="check" outputVariable="riskAssessment"
partnerLink="assessor"
portType="asns:riskAssessmentPT">
<target linkName="receive-to-assess"/>
<source linkName="assess-to-setMessage" transitionCondition=
"bpws:getVariableData('riskAssessment', 'risk')='low'"/>
<source linkName="assess-to-approval" transitionCondition="bpws:getVariableData
('riskAssessment', 'risk')!='low'"/>
</invoke>
<reply name="reply" operation="approve" partnerLink="customer" portType="apns:loanApprovalPT"
variable="approvalInfo">
<target linkName="approval-to-reply"/>
<target linkName="setMessage-to-reply"/>
</reply>
<assign name="assign">
<target linkName="assess-to-setMessage"/>
<source linkName="setMessage-to-reply"/>
<copy>
<from expression="'approved'"/>
<to part="accept" variable="approvalInfo"/>
</copy>
</assign>
</flow>
</process>
注意BPEL的元素有<partnerLink>, <variable>, <faultHandler>, <flow>, >target>等等。继续讲解BPEL语法的含义超出了本问的范围,但如果你跟进的话你就能发现在伪代码中有同样的模式。还要注意到,很多BPEL过程是使用特殊的编辑器创建的,这样可以避免手写XML时的错误。