fredag, juni 09, 2006

Coordination Patterns

För inte länge sedan tog jag del av CCR och fick då en förhoppning om att även utvecklare ska börja tänka processorienterat mha av detta ramverk. Fundamentet för processorienterad utveckling handlar nämligen om koordinering av asynkron meddelandehantering. Med det menas att kunna kontrollera inkommand och utgående kommunikation till och från processen.

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,
Arbiter.Choice(
Arbiter.Receive(true, port1, receiveBet1),
Arbiter.Receive(true, port2, receiveBet2)
)
);
Synchronization Pattern

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>
<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>
CCR:

Arbiter.Activate(taskQueue,
Arbiter.JoinedReceive(true, bet1, bet2, anyHandler)
);
Vilket språk föredrar du?

Inga kommentarer: