【问题标题】:Using BizTalk Flat File Disassembler to split incoming file by larger than 1 record?使用 BizTalk 平面文件反汇编程序将传入文件拆分大于 1 条记录?
【发布时间】:2011-10-18 21:18:30
【问题描述】:

我有一个传入的平面文件,我希望接收该文件并将其分解为离散的块以进行更有效的处理。 BT2010 有一篇关于获取平面文件反汇编程序以帮助解决此问题的示例帖子:

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

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

有没有办法让库存的 FF 反汇编器在这里玩得很好,还是我们需要编写一个自定义反汇编器?或者有没有其他好的方法来获得我们想要的分块行为?

谢谢。

【问题讨论】:

    标签: biztalk flat-file


    【解决方案1】:

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

    GetNext 方法读取较大文件中数据的方式似乎存在问题,这可能会导致内存使用过多(我曾遇到过这种情况,其中包含大约 800 000 个行项目的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-04
      • 1970-01-01
      • 2017-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多