【问题标题】:BizTalk custom adaptorBizTalk 自定义适配器
【发布时间】:2010-12-13 15:05:11
【问题描述】:

我不确定我问的问题是否正确,但这是我正在尝试运行的场景:

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

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

谢谢。

【问题讨论】:

    标签: biztalk biztalk-2009


    【解决方案1】:

    大卫的答案是正确的。

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

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

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

    现在是简单的部分:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 谢谢。这听起来像是我们必须做的。我们将需要对涉及编排/外部服务的消息/附件进行操作。
      【解决方案3】:

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

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

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

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

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

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

      灵活的相关性

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

      非均匀顺序车队

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

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

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

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

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

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

      【讨论】:

      • 大卫,感谢您提供此信息。 Convoy 看起来很有趣,但我不确定在这种情况下它会如何工作。你看,附件是二进制文件,对内容 XML 文件一无所知。这些附件没有什么可推广的。也许我错过了一些东西,请随时指出。 10x 肖恩
      • 这显然是正确的答案。即使您对 XML 文件的内容一无所知,您也肯定知道它的名称和位置。由此,您可以像这样使用灵活的关联:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-10
      • 2010-11-13
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多