#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.
Существует несколько статей, но в данных реализациях есть некоторые серьезные оговорки при работе с большими сообщениями: