CCR är ett ramverk till C# 2.0 och kan jämföras med bland annat CSP för Java, men även med BPEL. CCR är en bredare produkt som tillsammans med C# kan användas i många fler sammanhang än orkestrering av web service, som är BPELs huvudsakliga uppgift.
Men låt oss ändå jämföra hur BPEL och CCR utmanar 2 vanliga koordineringsmönster. För fler mönster som relaterar till workflows och meddelandehantering se här och där.
Racing Incoming Messages Pattern
En instans ämnar ta emot fler än ett inkommande meddelande, men är bara intresserad av det första. Exemplet nedan visar hur man enbart tar emot det först inkommande budet på en auktion.
BPEL:
<pick>
<onMessage operation="receiveBet" partnerLink="partner1"
portType="port1" variable="bet1">
<!-- Handler code belongs here -->
</onMessage>
<onMessage operation="receiveBet" partnerLink="partner2"
portType="port2" variable="bet2">
<!-- Handler code belongs here -->
</onMessage>
</pick>
CCR:
Arbiter.Activate(taskQueue,Synchronization Pattern
Arbiter.Choice(
Arbiter.Receive(true, port1, receiveBet1),
Arbiter.Receive(true, port2, receiveBet2)
)
);
I ett parallellt flöde behöver man synkronisera två eller flera sekvenser. Exemplet nedan visar hur man låter båda budgivarna få en chans att bjuda i auktionen.
BPEL:
<flow>CCR:
<links>
<link name="bet1" />
<link name="bet2" />
</links>
<receive name="receiveBet1" operation="receiveBet"
partnerLink="partner1" portType="port1" variable="bet1">
<source linkName="bet1"/>
</receive>
<receive name="receiveBet2" operation="receiveBet"
partnerLink="partner2" portType="port2" variable="bet2">
<source linkName="bet2"/>
</receive>
<anyBPELActivity>
<target linkName="bet1"/>
<target linkName="bet2"/>
</anyBPELActivity>
</flow>
Arbiter.Activate(taskQueue,Vilket språk föredrar du?
Arbiter.JoinedReceive(true, bet1, bet2, anyHandler)
);
Inga kommentarer:
Skicka en kommentar