|
在Azure Services Platform上对于工作流服务的支持,一直是我很感兴趣的内容。当然也是疑问比较多的领域。鉴于这方面的资料太少,所以今天就从AzureServicesKit中的一个DEMO出发,来大概了解一下这方面相关内容。
注:今天的示例位于AzureServicesKit安装目录/Labs/Ex02-RoutingWithXPath/end文件夹。
(编辑注:是AzureServicesKit/Labs/IntroWorkflowService/Ex02-RoutingWithXPath/end文件夹)
该示例场景展示的是一个定单(order)流程,如下图:
注:图中的两个服务可能布置在1台或N台机器上。
在上图中,我们看出在当前场景中存在两个服务,即:
BillService(即定单生成)。 ShipOrderService(定单处理:包括处理定单相关信息等)
其中的BillService的代码如下:
[ServiceContract(Name = "Billing", Namespace = "http://Microsoft.ServicePlatformLabs")]public class BillingService{ [OperationContract(Name = "Invoice", IsOneWay = true)] public void Invoice(string orderId, string total) { Console.WriteLine("Invoice for Order {0} ({1}) generated", orderId, total); }}
注:上面的ServiceContract属性Name="Billing"和OperationContract属性Name = "Invoice"会以链接方式绑定到工作流CloudServiceBusSend活动(activity)的Action属性上,即:
http://Microsoft.ServicePlatformLabs/Billing/Invoice
ShippingService的代码如下:
[ServiceContract(Name = "Shipping", Namespace = "http://Microsoft.ServicePlatformLabs")]public class ShippingService{ [OperationContract(Name = "ProcessOrder", IsOneWay = true)] public void ProcessOrder(string orderId) { Console.WriteLine("Processing Shipping information for Order {0}", orderId); }}
同理,ShippingService会以链接方式绑定到工作流CloudServiceBusSend活动(activity)的Action属性上,即:
http://Microsoft.ServicePlatformLabs/Shipping/ProcessOrder
而这两个服务都会被暴露到ServiceBus中以便让用户进行访问操作,从而完成一个客户下订单的完整流程(CreateOrder)
而如何对这两个服务进行安排组装,就是通过WorkFlow的进行的。如果有开发过工作流经验的开发者应该会很容易理解这个概念。不过这里还是要解释一下,就是在云中运行的工作流与我们平时所了解的工作流(主要是在Activities方面)还是有些差异的,当然这并不意味着云中的工作流要更难于理解,恰恰相反,就目前而言,还是很容易的,下面是其在VS中的设计器中的截图:
有关这几个新添加的工作流activity,可能就要几个篇幅来介绍和说明,因为今天的目的不在于此,所以就先略过这块内容了。
另外就是目前在云中只支持CloudSequentialWorkFlow,如下图:
目前还不支持状态机工作流,但并不确保将来就不会出现。当然将来会不会出现workflow4中的flowchart型工作流就更不好说了。
假设我们最终要实现的工作流程如下:
1.接受客户端post过来的请求,并获取其中指定的节点信息,本DEMO中节点路径为:
<root> <order> <total>节点值</total> </order></root>
2.通过对该节点值进行比较判断,当值大于1000时则将工作流程转入一个CloudDelay活动中,以进行延时操作(设置CloudDelay活动的TimeOut属性)。当值小于或等于1000时则顺序执行上面所介绍的两个服务(BillingService,ShippingService)
将上面的流程中工作流进行表示(创建)的结果如下图:
好了,现在我们有了工作流和服务,接下来就是通过编码将服务运行起来以及将工作流发布到Azure上了。下面是服务的创建运行代码:
internal static void Main(){ var billingServiceHost = new ServiceHost(typeof(BillingService)); Console.WriteLine("BillingService hosted at:"); Console.WriteLine("/t" + billingServiceHost.Description.Endpoints[0].Address.Uri); billingServiceHost.Open(); var shippingServiceHost = new ServiceHost(typeof(ShippingService)); Console.WriteLine("ShippingService hosted at:"); Console.WriteLine("/t" + shippingServiceHost.Description.Endpoints[0].Address.Uri); shippingServiceHost.Open(); Console.WriteLine(); Console.WriteLine("Press [Enter] to exit"); Console.ReadLine(); billingServiceHost.Close(); shippingServiceHost.Close();}
上面代码中的Address.Uri属性是在app.config中进行配置的:
代码在这里展开NET技术:Azure Services Bus(服务总线)中的工作流(workflow),转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。