2

我正在尝试为 BizTalk 2010 创建一个自定义管道组件,它将传入的平面文件拆分为多个较小的文件。我想将文件(可以说大约 30 000 行)拆分为每个大约 5000 行或更少的文件(可以说文件是否包含 33 000 行)。

我曾尝试使用Selvan 的自定义反汇编管道的绝佳示例,但无济于事。

我已经使用管道组件向导来生成管道骨架,但是对于如何继续对反汇编阶段进行编码和拆分大文件的任何提示或指示,我将非常高兴。我几乎是这种编码的新手。

有什么帮助吗?

4

1 回答 1

3

拆分消息只能通过反汇编组件来完成。您可以创建一个继承自现有反汇编程序的类(就像 Selvin 所做的那样),或者您可以指定要在管道组件向导中为接收管道类型创建一个“DisassembleParser”组件类型。如果您可以重用设计时属性但不是必需的,那么继承很有用。

当它运行时,BizTalk 通过“反汇编”方法传递消息。此方法返回后,BizTalk 开始轮询“GetNext”方法,直到它返回 null 以获取所有输出消息。所以你需要设计的是如何在“Disassemble”方法中准备消息,以便在BizTalk调用“GetNext”时返回所需的拆分消息。

塞尔文的做法是:

  • 在“反汇编”中,使用 BizTalk 的平面文件反汇编程序(base.Disassemble)将整个平面文件转换为 XML,并让基类存储 XML 输出
  • BizTalk 第一次调用“GetNext”时,从基类 (base.GetNext) 中检索未拆分的 XML 消息,并将其加载到 XPathDocument 中并根据节点数进行拆分。为每个部分创建一条新消息并保存在集合中。
  • 每次调用“GetNext”都会返回消息集合中的一条消息,直到它们全部返回,因此该方法返回“null”。

正如他所指出的,使用 XPathNavigator 不适用于非常大的消息。尽可能使用 XmlReader 总是最好的,这样消息可以作为流处理,而不会完全加载到内存中。这可以通过将 GetNext 流程重新设计为:

  • 第一次调用为反汇编的 XML 消息流创建 XmlReader。
  • 对于对 GetNext 的每次调用,使用 XmlReader 向前读取所需数量的节点,同时写入与新 BizTalk 消息一起返回的新输出流。
  • 当您到达 XML 消息的末尾时,您可以关闭阅读器并返回 null。

根据您的描述,听起来您可能想要输出平面文件而不将它们反汇编成 XML,在这种情况下,我建议在调用 Disassemble 时只保存输入流,然后使用相同的 GetNext 设计,但使用 StreamReader 而不是 XmlReader .

于 2015-09-25T04:39:15.083 回答