BizTalk FF Disassembler - работает только с очень маленькими файлами
У меня есть решение BizTalk 2016 / VS 2015. Существует простая схема плоского файла, которая запускает каждую строку, имея повторяющийся элемент записи, свойство "Max Occurs" которого установлено в 0.
Часть "config" схемы можно увидеть ниже:
<?xml version="1.0" encoding="utf-16"?>
<xs:schema xmlns="http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF" xmlns:b="http://schemas.microsoft.com/BizTalk/2003" attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:annotation>
<xs:appinfo>
<schemaEditorExtension:schemaInfo namespaceAlias="b" extensionClass="Microsoft.BizTalk.FlatFileExtension.FlatFileExtension" standardName="Flat File" xmlns:schemaEditorExtension="http://schemas.microsoft.com/BizTalk/2003/SchemaEditorExtensions" />
<b:schemaInfo standard="Flat File" codepage="65001" default_pad_char=" " pad_char_type="char" count_positions_by_byte="false" parser_optimization="speed" lookahead_depth="3" suppress_empty_nodes="false" generate_empty_nodes="true" allow_early_termination="true" early_terminate_optional_fields="true" allow_message_breakup_of_infix_root="true" compile_parse_tables="false" root_reference="Employee" />
</xs:appinfo>
</xs:annotation>
<xs:element name="Employee">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" child_delimiter_type="hex" child_delimiter="0xA" child_order="postfix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
<b:properties>
<b:property distinguished="true" xpath="/*[local-name()='Employee' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='Data' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='NiNumber' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']" />
<b:property distinguished="true" xpath="/*[local-name()='Employee' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='Data' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='OrgLeaveDate' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']" />
<b:property distinguished="true" xpath="/*[local-name()='Employee' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='Data' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='PosLeaveDate' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']" />
<b:property distinguished="true" xpath="/*[local-name()='Employee' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='Data' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']/*[local-name()='PostStartDate' and namespace-uri()='http://LCC.Integration.Employees.Schemas.SAP.SapEmployee_FF']" />
</b:properties>
</xs:appinfo>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:annotation>
<xs:appinfo>
<groupInfo sequence_number="0" xmlns="http://schemas.microsoft.com/BizTalk/2003" />
</xs:appinfo>
</xs:annotation>
<xs:element maxOccurs="1" name="Data">
<xs:annotation>
<xs:appinfo>
<b:recordInfo structure="delimited" child_delimiter_type="hex" child_delimiter="0x9" child_order="infix" sequence_number="1" preserve_delimiter_for_empty_data="true" suppress_trailing_delimiters="false" />
</xs:appinfo>
</xs:annotation>
<xs:complexType>
Входной файл разделен табуляцией с окончанием строки в стиле Unix.
Единственное, что немного необычно в схеме плоских файлов, это то, что последний элемент "PostStartDate" имеет значение атрибута micOccurs, равное 0. Это потому, что есть несколько провайдеров этого документа, и один из провайдеров не включает " PostStartDate "столбец.
Я настроил место получения, содержащее дизассемблер FF. Он имеет свойство DocumentSpecName, установленное на свойство схемы. Все остальные свойства по умолчанию.
Единственный подписчик на этот прием - это порт отправки, который отправляет в локальную папку.
Если я уронить плоский файл с 3 рядами, то все работает нормально. Однако если я добавлю еще несколько строк (всего 7 в этом примере), то BizTalk приостанавливает работу в месте получения с ошибкой: "Механизм обмена сообщениями обнаружил ошибку во время обработки одного или нескольких входящих сообщений". В журнале событий я вижу ошибку:
There was a failure executing the receive pipeline: "LCC.Integration.Common.Pipelines.RcvArchiveFF, LCC.Integration.Common.Pipelines, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ff3873c2d0a7e656" Source: "Flat file disassembler" Receive Port: "SharePoint.Employees.Receive.SAPExtract" URI: "D:\FileDrop\Employees\In\*.txt" Reason: Unexpected data found while looking for:
'\t'
The current definition being parsed is Employee. The stream offset where the error occured is 1813. The line number where the error occured is 8. The column where the error occured is 0.
Еще одна вещь, которую я заметил, если я удаляю конечную LF из последней строки в файле, то это работает - независимо от количества строк.
Я сделал скриншот для демонстрации проблемы: Скринкаст проблемы
Я создал пример решения, чтобы продемонстрировать проблему. Это доступно в следующем репозитории github: https://github.com/RobBowman/BizTalkFFProblem
Есть идеи?
1 ответ
Изменить: Я только что попробовал ваш пример GitHub в BizTalk 2013R2, и он работает без изменений.
Edit2: сломан, когда>20 строк.
Edit3: теперь я понимаю, что это на самом деле не поддерживается, настройка: "Разрешить разрыв сообщения в Infix
Root '... ваша схема не инфикс, это postfix
, Разгрузка FlatFiles на дизассемблере поддерживается только тогда, когда infix
, Если возможно, вы должны сделать свою схему для поддержки infix
тогда это сработает.