BizTalk自定义适配器

时间:2009-11-05 22:08:46

标签: biztalk biztalk-2009

我不确定我是否提出了正确的问题,但这是我想要运行的情景:

多个文件(XML和一些相关文件,“附件”)必须作为单个消息进入BizTalk。我已经研究过现有的适配器,并且看不到现有的适配器。为了更准确,文件来自文件系统。文件不会同时找到,但一旦到达,则无法确保订单。 XML(内容)文件是知道它必须具有哪些附件(其他文件)的文件。

我们正在研究BizTalk 2009,我想知道自定义适配器或其他东西的责任。我是否可以寻找样品。

感谢。

3 个答案:

答案 0 :(得分:7)

可能使用自定义适配器做你想做的事情,虽然我建议反对它。您可以使用编排来实现所需。

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

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

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

有一篇文章[这里](http://msdn.microsoft.com/en-us/library/ms942189(BTS.10).aspx)由斯蒂芬·W·托马斯关于车队(这是针对BT 2004,但概念仍然存在),并且在网络和书籍中有很多其他信息(专业的BizTalk服务器2006有一个小节)

如果没有关于你的场景的更多细节,很难确切地知道车队将如何建造,但下面有两种方法可以看(同样,我没有机会正确使用BT2009,所以可能会有更多支持相关场景可以帮助你。)

灵活关联

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

非均匀顺序车队

如果您之前确实有一点信息,可以采用以下方式(基本上是非均匀顺序车队):

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

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

此业务流程将具有为您的内容文件设置的单个激活接收形状。

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

然后将它们一起打包到设计的单个出站文件中,并在收到完整数量的文件后将其发送出去。

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:1)

大卫的答案是正确答案。

即使在您对预期附件的内容一无所知的情况下,您肯定知道他们的名字和位置。因此,您可以使用链接到david的答案中的灵活关联,如下所示:

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

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

现在轻松一点:

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

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

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