Azure Services Bus(服务总线)中的工作流(workflow)

在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),转载需保留来源!

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。