Использование BizTalk Flat File Disassembler для разделения входящего файла более чем на 1 запись? - PullRequest
2 голосов
/ 19 октября 2011

У меня есть входящий плоский файл, который я хочу получить и разбить на отдельные куски для более эффективной обработки.Вот хороший пример сообщения для BT2010 о том, как разобраться с разборщиком плоских файлов, здесь:

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

Однако в нижней части поста вы увидите, что они установилиМаксимальное число записей тела в 1 и аккуратно разбить файл на одно сообщение на запись.Тем не менее, я хотел бы разбить мой файл на куски по 1000 записей.Однако, когда попытка установить максимальное значение равно 1000, конвейер читает нормально до последнего фрагмента, который не является четным 1000 записей, и затем мы получаем неожиданную ошибку конца потока.

Есть ли способ заставить стандартный дизассемблер FF играть хорошо, или нам нужно написать собственный дизассемблер?Или есть какой-то другой хороший способ получить желаемое поведение?

Спасибо.

1 Ответ

2 голосов
/ 14 февраля 2012

Максимальное значение происходит для удаления сообщений из входящего сообщения, а не для определения количества записей в выходном сообщении.Таким образом, вам придется создать собственный компонент дизассемблера плоских файлов, который читает входящий файл в пакетном режиме: считывает некоторые данные из потока (например, на основе количества строк) и передает их.

Кажется, чтовозникла проблема с тем, как метод GetNext считывает данные в больших файлах, что может привести к чрезмерному использованию памяти (у меня был сценарий, когда это происходило с файлом размером 10 МБ, содержащим около 800 000 позиций).Таким образом, все, что нужно сделать, это заново реализовать метод 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", переданный в конструктор компонента дизассемблера плоских файлов.Возможно, вы сможете контролировать чтение данных, передав собственный метод чтения данных в конструктор вашей пользовательской реализации компонента дизассемблера плоских файлов.

Есть пара статей, но приведенные реализацииимеет ряд серьезных предостережений при работе с сообщениями большего размера:

Отладка больших сообщений и расширение компонента дизассемблера конвейера плоского файла в Biztalk 2006

Обработка плоского файла 10 МБ в BizTalk

...