返回首页

介绍
这篇文章描述了一个基于BizTalk 2006/R2/BizTalk 2009年分裂和收到的消息发送到许多不同的目的地的实施。运行之前不知道目的地的数量。的BizTalk消息接收器读取信息并发送一个消息给每个目标系统。的BizTalk接收从每个被送回寄件人的目标,他们聚集到一个响应消息的响应。
这个实现可以使用的一个例子是一个Web应用程序时需要比较来自不同供应商的产品价格。 Web应用程序发送一个请求到代理,并接收返回的响应,其中包括来自不同供应商的价格。概观
这个实现包含两个不同的业务流程。父编排收到消息,接收器的数量计算,创建一个邮件的副本,并开始为每个收件人的孩子编排。
儿童编排读取接收的消息ID和使用,发现从数据库中的交通信息和地址。对接收的所有信息存储在数据库中,只有接收器的ID包含在消息中。一个单独的。NET程序集被用来得到这个信息。孩子编排一个动态的基础上,有关接收信息的发送端口配置,将消息发送到目标系统。它也接收从目标系统的响应。
父编排使用自相关的绑定端口,接收从孩子编排的响应。它添加到一个消息响应,并收到响应时,它调用一个管道消息聚合成一个信封,然后它发送所有响应的信封返回给发件人。 消息
有在此实施包括四个不同的消息,而每一种都有其自己的模式。一个架构的主要要求是由经纪人,并为主要反应而被送回发件人收到。还有一个收件人的请求被发送到目标系统和收件人响应目标系统发送回代理架构。母公司业务流程
的BizTalk收到的消息,在这种情况下,包含了一个纪录为主要的接收器和一个或多个记录的副本目的地。收到邮件时由静态接收端口和接收形状激活业务流程。业务流程的交易类型设置为长时间运行的超时设置是有一天。计数的接收目的地
首先要做的是计算复制目的地。这样做是在表达形状。总数存储在变量intTotalRecipients。

intTotalRecipients = System.Convert.ToInt32(xpath(msgMainRequestIN,

  "count(/*[local-name()='Request' and namespace-uri()='http://Stm.MessageBroker" + 

  ".Schemas.MainRequest']/*[local-name()='CopyDest' and " + 



  "namespace-uri()='http://Stm.MessageBroker.Schemas.MainRequest'])"));

intRecipientNumber = 0;

{S0的}为每个目标,构建个人信息
单个消息创建变量intRecipientNumber只要是受助人总数小于或等于在一个循环中运行。变量intRecipientNumber用于保存当前的收件人,它增加了一个循环结束。首先,创建一个消息的主要目的地。这是一个结构形状,它只是个别受助人的请求,收到的主要请求映射如果intRecipientNumber等于0。
对于每个副本的目标,首先构造一个辅助信息。此消息是基于一个简单的模式,只有两个领域,它包含了当前收件人的价值和的intRecipientNumber价值。 (其他领域不被使用。)是杰出的领域。消息赋值表达式看起来像这样:{C}
此消息是,一起用作映射输入到收件人要求在结构形状,构造收件人请求,主要要求。 (地图,可以创建一个具有两个输入模式时,选择在变换形状,以创建一个新的地图。)在这张地图上,指数functoid的使用,以得到正确的复制目的地记录的值。输入指数functoid的助手消息(当前值的intRecipientNumber)和记录(复印件目标ID)从复制目的地的价值的价值。
在这一点上,正确构建个人请求:
{S}启动子的业务流程,并等待响应
自相关的绑定端口,用于接收从子业务流程的答复。的端口标识符是ReceiveFromChildPort的的和端口类型FromChildPortType。此端口和上面构造收件人请求被用作参数时,启动子编排。业务流程引擎,然后生成一个相关的消息,特别是在业务流程实例令牌。这提供了响应返回到父流程实例没有使用相关集的能力。
的变量intRecipientNumber设置为0和一个新的循环用于接收通过端口ReceiveFromChildPort反应的。 intRecipientNumber是增加循环结束循环的运行,直到intRecipientNumber是等于intTotalRecipients和所有收到的答复。
{S2的}聚合反应和发送一个响应返回给发件人
收到的答复中添加类型的变量MessagesToAggregate在上述循环中的表达形状SendPipelineInputMessages。
MessagesToAggregate.Add(msgRecipientResponse);

intRecipientNumber = intRecipientNumber + 1;

当循环结束后,这个变量包含了所有的反应。然后构造一个新的消息类型的XmlDocument AggregatedMessage。这是通过调用发送管道聚合反应。发送管道包含一个主要响应模式被指定为一个信封架构和作为一个文档架构中指定的收件人响应架构XMLassembler。为了使这项工作,重要的是,信封架构包含任何元素,包括收件人的反应。建设AggregatedMessage和调用发送管道在结构形状的表达看起来像这样:{体C3}
,AggregatedMessage然后将其发送回给发件人。
{S3的}孩子的业务流程
儿童编排有两个业务流程参数:这是收件人请求消息的消息参数,作为母公司的业务流程,FromChildPortType自相关的绑定端口有相同的端口类型和端口参数。关于接收器获取的信息,并配置动态发送端口
对不同接收机的所有信息存储在数据库中。在这个例子中,是一个表,包含字段PartnerID,PartnerName,和TransportType的名为合作伙伴。再有就是为每一个可能的运输类型的表。一个FileInfo表包含了所有必要的信息动态文件端口配置与传输类型文件的合作伙伴。类似的表也存在运输SMTP类型的合作伙伴。外部组件可以从数据库中获得此​​信息。本次大会提供了运输对象,并在业务流程中,有一个变量名为objTransport这种类型。本次大会是经纪人的一部分,因此将在这篇文章中给出任何解释。然而,源代码包含在下载。介意,本次大会是如何得到这个数据只是一个简单的例子。
第一个表达式形状得到接收机的杰出领域的ID和初始化objTransport对象。{的C4}
当调用的InitializeByPartnerId的方法,外部组件看起来的合作伙伴表中找到正确的传输类型。然后,它看起来在正确的表和填补信息objTransport属性。 objTransport对象包含所有传输类型的属性。
根据的objTransport.TransportType属性,一个新的收件人请求消息的构造和动态发送端口配置。在SMTP的情况下,在结构形状的消息分配形状看起来像这样:{C5的}
构造的消息,然后通过动态发送端口发送到目标系统。接收来自目标的响应,并将其发送到父编排
将消息发送到目标发送的形状,初始化相关集的基础上在接受请求,并在收件人响应OriginalMsgId领域的MsgId。这些都促进领域。收件人的反应需要含有#原始收件人请求的关联。 (此的MsgId独特的每个收件人的主要要求收件人请求的映射。)一个接收形状接收响应并跟进此相关集。
发送形状发送响应返回给父业务流程,通过与港口型FromChildPortType的发送端口。请注意,这是定义用于接收响应的父编排,并在孩子编排端口参数使用相同的端口类型。
{A}一般的异常处理程序
一般例外处理程序添加,以便发送构造的响应返回给父业务流程,如果出现错误,或者如果没有超时限制内收到答复。捕获异常可以在几个方面。在这种情况下,一些错误信息的一个简单的回应是创建和送到父编排。测试和安装
测试实施所有必要的源代码包含在下载的解决方案。不包括数据库,但数据库是如何设计在外部。NET程序集的源代码很容易看到。
。NET程序集,需要建立和安装在GAC中。需要部署到BizTalk解决方案中的所有其他项目。

回答