微软工作流,基于微软并行计算的工作流解决方案 (1) Parallel Activity

在微软WF4中有一个Parallel活动,它可以模拟并行执行,但可惜的是Parallel活动并不是一个真正意义上的并行计算方案,实际上Parallel利用了一个线程去分时间段执行下面的各个分支。
今天,我们要做的就是基于Parallel活动和微软.net framework 4中的并行任务Task,构造一个实际的并行工作流。并将它扩展为通用的并行工作流解决方案。
我们首先构造一个虚拟的订单处理流程,它包含主要三个活动
(1) 订单初始化
(2) 将订单有关信息拷贝到零件数据库(Part DB)
(3) 将订单有关信息拷贝到车辆数据库(Vehicle DB)
(4) 结束订单
传统的做法是构造一个服务,顺序执行(1)->(2)->(3),但在实际业务过程中,一旦订单初始化后,2,3流程没有先后次序关系,可以并发执行。
来看业务流程图 CloseOrder Workflow (FlowChart):
微软工作流,基于微软并行计算的工作流解决方案 (1) Parallel Activity微软工作流,基于微软并行计算的工作流解决方案 (1) Parallel Activity
首先我们定义一个简单的Order类
public class Order { public Guid Id {get;set;} public string Customer { get; set; } public string PartNumber { get; set; } public int Quantity { get; set; } public OrderStatus Status { get; set; } } public enum OrderStatus { Initilized, InProcess, Cancelled, Failed, Succeeded }
然后分别模拟零件数据库同步活动和车辆数据库同步活动。
public class PartDBReplicationActivity : NativeActivity { public InOutArgument OrderInActivity { get; set; } protected override void Execute(NativeActivityContext context) { //Console.WriteLine("PartDBReplication Activity starts at:{0}",DateTime.Now.ToString()); Order order = context.GetValue(OrderInActivity); order.Status = OrderStatus.InProcess; //Call Part service Thread.Sleep(5000); //Console.WriteLine("PartDBReplication Activity ends at {0}.\r\n", DateTime.Now.ToString()); } } public class VehicleDBReplicationActivity : NativeActivity { public InOutArgument OrderInActivity { get; set; } protected override void Execute(NativeActivityContext context) { //Console.WriteLine("VehicleDBReplication Activity starts at:{0}", DateTime.Now.ToString()); Order order = context.GetValue(OrderInActivity); order.Status = OrderStatus.InProcess; //Call Vehicle service Thread.Sleep(5000); //Console.WriteLine("VehicleDBReplication Activity ends at {0}.\r\n", DateTime.Now.ToString()); } }
两个活动分别要执行5秒钟(Thread.Sleep(5000)),但是由于并行,它们实际应该总共只要花5秒。
再来看订单初始化活动
public class OpenOrderActivity : NativeActivity { public InOutArgument OrderInActivity { get; set; } protected override void Execute(NativeActivityContext context) { Order order=new Order(); order.Id =Guid.NewGuid(); order.PartNumber="10506"; order.Customer ="CustomerA"; order.Quantity =1; order.Status = OrderStatus.Initilized; context.SetValue(OrderInActivity, order); } }
结束订单
public class CloseOrderActivity : NativeActivity { public InOutArgument OrderInActivity { get; set; } protected override void Execute(NativeActivityContext context) { //Console.WriteLine("CloseOrder Activity starts at:{0}", DateTime.Now.ToString()); Order order = context.GetValue(OrderInActivity); order.Status = OrderStatus.Succeeded; //Console.WriteLine("CloseOrder Activity ends at {0}.", DateTime.Now.ToString()); //Console.WriteLine(""); } }
我们运行一下整个流程
class Program { static void Main(string[] args) { DateTime dtStart = DateTime.Now; Console.WriteLine("CloseOrder workflow starts at:{0}", dtStart); Console.WriteLine("--------------------------------------------------------------"); WorkflowInvoker.Invoke(new CloseOrderWorkflow()); //WorkflowInvoker.Invoke(new CloseOrderParallelWorkflow()); Console.WriteLine("--------------------------------------------------------------"); DateTime dtEnd = DateTime.Now; Console.WriteLine("CloseOrder workflow ends at:{0}", dtEnd.ToString()); Console.WriteLine("Total time elapsed in seconds :{0}",( dtEnd - dtStart).Seconds.ToString()); Console.Read(); } }
看看运行结果,
微软工作流,基于微软并行计算的工作流解决方案 (1) Parallel Activity
奇怪,整个活动花了10秒,Parallel活动的分支不是真正意义上的并行,主要原因我们刚才说过工作流中的Parallel利用了一个线程模拟分支并行的,我们的Thread.Sleep阻塞了其他分支的运行,导致整个流程运行实际时间等于串行执行这四个活动。
下一节我们将要利用.net framework4里面的Parallel Task去实现真正意义的并行工作流。
Tags:  云计算与并行计算 并行计算实验报告 并行计算云计算 并行计算 微软工作流

延伸阅读

最新评论

发表评论