BizTalk自定义适配器

BizTalk自定义适配器,biztalk,biztalk-2009,Biztalk,Biztalk 2009,我不确定我问的问题是否正确,但这是我尝试运行的场景: 多个文件(XML和一些相关文件,“附件”)必须作为一条消息进入BizTalk。我已经研究了现有的适配器,但并没有发现在现有适配器上做过一次。更准确地说,文件取自文件系统。文件不会在同一时间找到,但在无法确保顺序的情况下,一次只能找到一个文件。XML(内容)文件是知道它必须具有哪些附件(哪些其他文件)的文件 我们正在研究BizTalk 2009,我想知道定制适配器的责任是什么,还是其他什么。如果我能找到样品的话 谢谢。使用自定义适配器可能实现您

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

多个文件(XML和一些相关文件,“附件”)必须作为一条消息进入BizTalk。我已经研究了现有的适配器,但并没有发现在现有适配器上做过一次。更准确地说,文件取自文件系统。文件不会在同一时间找到,但在无法确保顺序的情况下,一次只能找到一个文件。XML(内容)文件是知道它必须具有哪些附件(哪些其他文件)的文件

我们正在研究BizTalk 2009,我想知道定制适配器的责任是什么,还是其他什么。如果我能找到样品的话


谢谢。

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

你要找的是一个护航队,或者至少是一些相关性

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

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

(这里)有一篇斯蒂芬·托马斯(Stephen W.Thomas)写的关于护航队的文章(这是针对BT 2004的,但概念仍然适用),在web和书籍中有很多其他信息(专业BizTalk server 2006有一个关于护航队的小节)

如果没有关于您的场景的更多细节,很难确切知道车队将如何建造,但下面有两种方法可供参考(此外,我还没有机会正确使用BT2009,因此可能会有对相关场景的扩展支持来帮助您)

灵活关联

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

非统一顺序护航

如果您手头确实有一点信息,一种方法可能如下(基本上是非统一顺序车队):

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

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

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

一旦业务流程由内容文件启动,第二个相关接收形状将开始拾取与该内容文件匹配的消息。(此第二个接收可能处于循环中,以允许不同数量的文件)


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

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

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


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

David的答案是正确的

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

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

首先,创建一个自定义接收管道,使用一个自定义管道组件来提升接收消息的BTS.ReceivedFileName上下文属性。这个简单的自定义组件非常容易编写,但您可以通过使用第三方框架(如,(无耻的插件,此处)my class或其他优秀工具使其变得简单

现在来看简单的部分:

  • 附件在文件系统上由其路径指定的特定位置接收
  • 创建侦听备用位置的接收位置,该位置仅用于控制BizTalk实际占用文件的时间
  • 在业务流程中,使用BTS.ReceivedFileName属性创建关联类型,并基于此关联类型创建关联集
  • 当您想要接收二进制附件时,发送一条伪消息,将BTS.ReceivedFileName上下文属性设置为二进制附件的文件名,但路径与接收位置使用的备用位置匹配。初始化发送形状上的相关性
  • 使用表达式形状将二进制文件从其原始位置复制到接收位置使用的位置
  • 最后,使用绑定到接收端口的接收形状,该接收端口包含其自定义接收管道将提升BTS.ReceivedFileName属性的接收位置
请注意,您实际上需要发送一条消息来初始化相关性。实际上发送的消息并不重要。我要做的是通过包含空管道组件的发送管道发送消息。该管道组件读取消息,但返回nul