使用BizTalk平面文件反汇编程序将传入的文件拆分大于1条记录?

时间:2011-10-18 21:18:31

标签: biztalk flat-file

我有一个传入的平面文件,我希望接收并分成不连续的块,以便更有效地处理。 BT2010有一个很好的样本帖子,可以让平面文件反汇编程序帮助解决这个问题:

http://msdn.microsoft.com/en-us/library/aa560774(v=bts.70).aspx

但是,在帖子的底部附近,您会看到他们将正文记录的最大值设置为1,并将文件整齐地分成每条记录一条消息。但是,我想将我的文件拆分为1000条记录。但是,当尝试将max设置为1000时,管道读取正常,直到最后一个块不是偶数1000个记录,然后我们得到意外的流错误结束。

有没有办法让股票FF反汇编程序在这里发挥得很好,还是我们需要编写自定义反汇编程序?或者还有其他一些很好的方法来获得我们想要的分块行为吗?

感谢。

1 个答案:

答案 0 :(得分:2)

最大值用于从传入消息中删除消息,而不是确定输出消息中应有多少条记录。因此,您必须创建一个自定义平面文件反汇编程序组件,该组件以批处理方式读取传入文件:从流中读取一些数据(例如,基于行数)并将其传递。

GetNext方法如何读取较大文件中的数据似乎存在问题,这可能会导致内存使用过多(我遇到了一个包含大约80万个订单项的10Mb文件的情况)。因此,所有人需要做的是重新实现GetNext方法,以满足您为每条消息输出一定数量记录的情况,同时更有效地处理更大的消息。

这是原始GetNext(重要部分)方法反编译代码的一部分:

private IBaseMessage GetNext2(IPipelineContext pc)
    {
      ...
            baseMessage = this.CreateOutputMessage(pc);
      ...
          baseMessage = this.CreateOutputMessage(pc);
        ...
        return baseMessage;
    }

“CreateOutputMessage”方法最终调用“CreateNonrecoverableOutputMessage”方法,这是处理较大消息时似乎存在问题的方法:

internal IBaseMessage CreateNonrecoverableOutputMessage(IPipelineContext pc)
{
  ...
  XmlReader reader1 = this.m_docspec.Parse(this.m_inputData);
  ...
  return message;
}

创建了“m_inputData”变量,调用传递给平面文件反汇编程序组件的构造函数的“FFDasmComp.DataReaderFunction”委托。您可以通过将自己的数据读取器方法传递到平面文件反汇编程序组件的自定义实现的构造函数来控制数据读取。

有几篇文章,但在处理更大的消息时,给定的实现有一些严重的警告:

Debatching Large Messages and Extending Flatfile Pipeline Disassembler Component in Biztalk 2006

Processing 10 MB Flat File in BizTalk