Использование дизассемблера плоских файлов BizTalk для разделения входящего файла более чем на 1 запись?

#biztalk #flat-file

#biztalk #плоский файл

Вопрос:

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

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

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

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

Спасибо.

Ответ №1:

Значение max occurs используется для удаления сообщений из входящего сообщения, а не для определения того, сколько записей должно быть в выходном сообщении. Итак, вам нужно будет создать пользовательский компонент disassembler flat file, который считывает входящий файл пакетным способом: считывает некоторые данные из потока (например, на основе количества строк) и передает их дальше.

Похоже, существует проблема с тем, как метод 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», переданного в конструктор компонента дизассемблера плоских файлов. Возможно, вы сможете управлять чтением данных, передавая свой собственный метод чтения данных в конструктор вашей пользовательской реализации компонента flat file disassembler.

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

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

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