使用自定义管道将平面文件拆分为较小的文件(在行数上)

时间:2015-09-23 14:02:03

标签: c# biztalk biztalk-2010 flat-file custom-pipeline-component

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

我尝试使用自定义反汇编管道的Selvan's great example无效。

我使用了管道组件向导来生成管道骨架,但是对于如何继续编写反汇编阶段和拆分大文件的任何提示或指针都会非常满意。我几乎是这种编码的新手。

任何帮助?

1 个答案:

答案 0 :(得分:3)

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

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

塞万的方法是:

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

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

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

从你的描述中你可能想要输出平面文件而不将它们反汇编成XML,在这种情况下,我建议只在调用Disassemble时保存输入流,然后使用相同的GetNext设计但使用StreamReader代替一个XmlReader。