📄 atm.bpel
字号:
<?xml version="1.0" encoding="UTF-8"?>
<process name="AtmFrontEnd" targetNamespace="urn:samples:atm"
xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:bpel="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns:tns="urn:samples:atm" xmlns:atm="urn:samples:atm"
xmlns:typ="urn:samples:atm" xmlns:tic="urn:samples:ticket"
xmlns:acc="urn:samples:account" xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://schemas.xmlsoap.org/ws/2003/03/business-process/
http://schemas.xmlsoap.org/ws/2003/03/business-process/">
<partnerLinks>
<!-- relationship with the ATM -->
<partnerLink name="atm" partnerLinkType="tns:Atm-Front" myRole="FrontEnd" />
<!-- relationship with the ticket issuer -->
<partnerLink name="ticket" partnerLinkType="tns:Front-Ticket"
partnerRole="TicketIssuer" />
<!-- relationship with the account system -->
<partnerLink name="account" partnerLinkType="tns:Front-Account"
partnerRole="AccountSystem" />
</partnerLinks>
<variables>
<!-- ATM connection request -->
<variable name="connectReq" messageType="atm:connectRequest" />
<!-- ticket creation request -->
<variable name="ticketReq" messageType="tic:ticketRequest" />
<!-- ticket number wrapper -->
<variable name="ticketMsg" messageType="tic:ticketMessage" />
<!-- ATM connection flag -->
<variable name="connected" type="xsd:boolean" />
<!-- customer session flag -->
<variable name="logged" type="xsd:boolean" />
</variables>
<correlationSets>
<!-- conversation with a connected ATM -->
<correlationSet name="atmInteraction" properties="tns:ticketId" />
</correlationSets>
<sequence name="mainSequence">
<!-- receive a connection request -->
<receive name="connectIn" operation="connect" partnerLink="atm"
portType="atm:FrontEnd" variable="connectReq" createInstance="yes" />
<!-- generate a ticket number -->
<invoke name="createTicket" operation="createTicket" partnerLink="ticket"
portType="tic:TicketIssuer" inputVariable="ticketReq"
outputVariable="ticketMsg">
<correlations>
<correlation set="atmInteraction" pattern="in" initiate="yes" />
</correlations>
</invoke>
<!-- initialize the status flags -->
<assign name="initConnection">
<copy>
<from expression="true()" />
<to variable="connected" />
</copy>
<copy>
<from expression="false()" />
<to variable="logged" />
</copy>
</assign>
<!-- send the ticket number back to the ATM -->
<reply name="connectOut" operation="connect" partnerLink="atm"
portType="atm:FrontEnd" variable="ticketMsg">
<correlations>
<correlation set="atmInteraction" />
</correlations>
</reply>
<!-- handle the ATM connection -->
<scope name="connectionUnit">
<variables>
<!-- customer log on request -->
<variable name="logOnReq" messageType="atm:logOnRequest" />
<!-- connection status response -->
<variable name="statusRsp" messageType="atm:statusResponse" />
</variables>
<eventHandlers>
<!-- listen for connection status requests -->
<onMessage operation="status" partnerLink="atm" portType="atm:FrontEnd"
variable="ticketMsg">
<correlations>
<correlation set="atmInteraction" />
</correlations>
<!-- report the connection status -->
<sequence name="statusSequence">
<!-- set a status string depending on the flag values -->
<switch name="statusSwitch">
<case condition="bpel:getVariableData('logged')">
<assign name="setStatusLogged">
<copy>
<from expression="'logged'" />
<to variable="statusRsp" part="status" />
</copy>
</assign>
</case>
<case condition="bpel:getVariableData('connected')">
<assign name="setStatusConnected">
<copy>
<from expression="'connected'" />
<to variable="statusRsp" part="status" />
</copy>
</assign>
</case>
<otherwise>
<assign name="setStatusDisconnected">
<copy>
<from expression="'disconnected'" />
<to variable="statusRsp" part="status" />
</copy>
</assign>
</otherwise>
</switch>
<!-- send the status back to the ATM -->
<reply name="statusOut" operation="status" partnerLink="atm"
portType="atm:FrontEnd" variable="statusRsp" />
</sequence>
</onMessage>
</eventHandlers>
<!-- process ATM requests, one at a time -->
<while name="connectionLoop"
condition="bpel:getVariableData('connected')">
<!-- listen for either disconnect or log on request -->
<pick name="connectionMenu">
<onMessage operation="disconnect" partnerLink="atm"
portType="atm:FrontEnd" variable="ticketMsg">
<correlations>
<correlation set="atmInteraction" />
</correlations>
<!-- turn off connected flag for breaking the connection loop -->
<assign name="setDisconnected">
<copy>
<from expression="false()" />
<to variable="connected" />
</copy>
</assign>
</onMessage>
<onMessage operation="logOn" partnerLink="atm" portType="atm:FrontEnd"
variable="logOnReq">
<correlations>
<correlation set="atmInteraction" />
</correlations>
<!-- handle the customer session -->
<scope name="customerUnit">
<variables>
<!-- customer name wrapper -->
<variable name="customerMsg" messageType="acc:customerMessage" />
<!-- access check response -->
<variable name="accessMsg" messageType="acc:accessMessage" />
<!-- customer log on response -->
<variable name="logOnRsp" messageType="atm:logOnResponse" />
<!-- account balance wrapper -->
<variable name="balanceMsg" messageType="acc:balanceMessage" />
<!-- balance change request -->
<variable name="balanceChange" messageType="atm:balanceChange" />
<!-- account system operation request -->
<variable name="accountOperation"
messageType="acc:accountOperation" />
<!-- customer log on fault -->
<variable name="unauthorizedAccess"
messageType="atm:unauthorizedAccess" />
<!-- withdraw fault -->
<variable name="insufficientFunds"
messageType="atm:insufficientFunds" />
<!-- resulting balance after withdraw -->
<variable name="newBalance" type="xsd:double" />
</variables>
<correlationSets>
<!-- conversation with a logged customer -->
<correlationSet name="customerInteraction"
properties="tns:customerId" />
</correlationSets>
<sequence name="customerSequence">
<!-- populate access check request -->
<assign name="fillAccessCheck">
<copy>
<from variable="logOnReq" part="customerName" />
<to variable="customerMsg" part="customerName" />
</copy>
</assign>
<!-- check account access privilege -->
<invoke name="checkAccess" operation="checkAccess"
partnerLink="account" portType="acc:AccountSystem"
inputVariable="customerMsg" outputVariable="accessMsg">
<correlations>
<correlation set="customerInteraction" pattern="out"
initiate="yes" />
</correlations>
</invoke>
<!-- decide outcome of customer session request -->
<switch name="accessDecision">
<case
condition="bpel:getVariableData('accessMsg', 'granted')">
<!-- accept customer session -->
<sequence name="accessGrantedSequence">
<!-- turn on logged flag for starting session loop -->
<assign name="setLoggedOn">
<copy>
<from expression="true()" />
<to variable="logged" />
</copy>
</assign>
<!-- send acknowledgement back to ATM -->
<reply operation="logOn" partnerLink="atm"
portType="atm:FrontEnd" variable="logOnRsp" />
</sequence>
</case>
<otherwise>
<!-- reject customer session -->
<sequence name="accessDeniedSequence">
<!-- populate the log on fault -->
<assign name="fillAccessDenial">
<copy>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -