2

我不确定我是否提出了正确的问题,但这是我试图运行的场景:

多个文件(XML 和一些相关文件,“附件”)必须作为单个消息进入 BizTalk。我研究了现有的适配器,并没有看到现有的一次。更准确地说,文件取自文件系统。文件不是同时找到的,而是一次一个到达的,此时无法确保顺序。XML(内容)文件是知道它必须有哪些附件(还有哪些其他文件)的文件。

我们正在研究 BizTalk 2009,我想知道自定义适配器的职责是什么,或者其他什么。我可以寻找样品吗?

谢谢。

4

3 回答 3

6

使用自定义适配器可能会做你想做的事,但我建议不要这样做。您可以使用编排来实现您所需要的。

您正在寻找的就像一个车队,或者至少是一些相关性的使用。

在 BizTalk 中,convoy 是一种消息传递模式(与 BizTalk 功能相反),它允许由单个业务流程处理消息组。

您基本上使用接收端口上的相关性以并行(您可能想要的)或顺序方式将消息分组在一起。

Stephen W. Thomas有一篇关于车队的文章 [here]( http://msdn.microsoft.com/en-us/library/ms942189(BTS.10).aspx)(适用于 BT 2004,但概念仍然持有)并且有很多关于网络和书籍的附加信息(Professional BizTalk server 2006 有一个关于它们的小节)

如果没有关于您的场景的更多详细信息,很难确切知道车队将如何构建,但以下是两种查看方法(另外,我没有机会正确使用 BT2009,因此可能会扩展对相关场景的支持帮助你)。

灵活的相关性

如果您对上下文 XML 中列出的文件一无所知,您可能需要一种类似于 Charles Young 在本文中描述的模式。

非均匀顺序护航

如果您之前确实有一些信息,那么一种方法可能如下(基本上是非均匀顺序车队):

这假设有某种方法可以将所有文件链接在一起,以便您可以将它们关联起来。

创建一个订阅您的入站接收端口(包含文件接收位置)的业务流程。

此编排将具有为您的内容文件设置的单个激活接收形状。

一旦由内容文件启动编排,第二个相关接收形状就会开始拾取与该内容文件匹配的消息。(这第二次接收可能在一个循环中以允许可变数量的文件)

然后,您将它们全部打包到您设计的单个出站文件中,并在收到全部文件后将它们发送出去。

于 2009-11-07T04:52:21.157 回答
1

在我看来,更好的方法是结合自定义管道组件和/或自定义适配器来实现上述要求。我假设您实际上并不需要操作传入的文件(内容 XML 文件除外),或者您不需要操作,因为它们是二进制格式。这需要一个自定义管道组件。

您可以做的是开发一个自定义 BizTalk 适配器来与文件系统交互并实现侦听和循环逻辑。接下来,您可以开发自定义管道组件来创建单个 BizTalk 消息,其中可能包含用于二进制数据的 base64 数据类型。此外,您还可以直接在此组件中推广消息以启用编排订阅。

编排更适合实现消息已经采用 XML 格式的业务工作流场景。情况似乎并非如此。无论如何,我认为至少需要一个自定义管道组件。

于 2009-11-15T19:43:48.930 回答
1

大卫的答案是正确的答案。

即使在您对预期附件的内容一无所知的情况下,您也肯定知道它们的名称和位置。因此,您可以使用链接到大卫回答中的灵活相关性,如下所示:

解决方案的关键是关联内置的 BTS.ReceivedFileName 属性。

首先,创建一个自定义接收管道,其中包含一个自定义管道组件,用于提升接收到的消息的 BTS.ReceivedFileName 上下文属性。这个简单的自定义组件相当容易编写,但您可以通过使用第三方框架(如无耻的插件,此处)我的PipelineComponentBase类或出色的BizTalk Server 管道组件向导使其变得简单。

现在是简单的部分:

  • 附件在特定位置接收,由文件系统上的路径指定。
  • 创建一个侦听备用位置的接收位置,仅用于控制文件何时被 BizTalk 实际吞下。
  • 在您的业务流程中,创建一个具有 BTS.ReceivedFileName 属性的关联类型和一个基于此关联类型的关联集。
  • 当您想要接收二进制附件时,发送一条虚拟消息,并将 BTS.ReceivedFileName 上下文属性设置为二进制附件的文件名,但路径与备用位置匹配;接收位置使用的那个。初始化发送形状的相关性。
  • 使用表达式形状将二进制文件从其原始位置复制到接收位置使用的位置。
  • 最后,使用绑定到包含接收位置的接收端口的接收形状,其自定义接收管道将提升 BTS.ReceivedFileName 属性。

请注意,您实际上需要发送一条消息才能初始化关联。您实际发送什么消息并不重要。我要做的是通过包含管道组件的发送管道发送消息。那是一个读取消息但返回 null 的管道组件(这样消息在到达适配器之前就消失得无影无踪了)。更复杂的解决方案是使用适配器。那是一个读取消息但不做任何事情的适配器。

这两种解决方案避免了将许多文件堆积在某个临时位置,只是为了初始化关联!

于 2010-12-18T21:36:18.460 回答