BizTalk 2009 - Как запустить процесс после обработки всех сообщений из большого дизассемблированного файла

Мы ежедневно получаем много больших файлов данных в различных форматах (например, CSV, Excel, XML и т. Д.). Для обработки этих больших файлов мы преобразуем входящие данные в один из наших стандартных классов сообщений «коллекции» (используя XSLT и компонент конвейера - встроенный или настраиваемый), дизассемблируем большое преобразованное сообщение в отдельные «объектные» сообщения и затем вызовите серию методов веб-службы SOAP для обработки бизнес-логики и операций с базой данных.

В отличие от других полученных файлов, последний файл будет содержать все строки данных каждый день, и поэтому мы должны обрабатывать различия, чтобы предотвратить повторную обработку идентичных записей каждый день.

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

Мой текущий мыслительный процесс состоит в том, чтобы пометить удаленные записи в базе данных с помощью задачи «очистки» в конце всего процесса, но для этого потребуется вызов метода после завершения всех «объектных» сообщений из дизассемблированного файла.

Можно ли отслеживать отдельные сообщения из файла с несколькими записями и вызывать метод после завершения всего файла? В настоящее время все исследования указывают на сочетание с каким-то «ожиданием», но является ли это единственным вариантом?

Пример: файл содержит 100 записей об автомобилях. Он разбирается на 100 отдельных XML-сообщений, которые обрабатываются с помощью 100 вызовов метода веб-службы. Хотите вызвать операцию очистки, когда будут завершены все 100 сообщений.


person user3058145    schedule 02.12.2013    source источник


Ответы (2)


Лучший способ, который я нашел для обработки сценария «все строки каждый день», - это предварительно подготовить данные в SQL Server, чтобы легче было сравнить «текущий» набор с «предыдущим» набором. Операторы INTERSECT и EXCEPT в большинстве случаев упрощают задачу.

Затем слейте записи с помощью оператора опроса.

person Johns-305    schedule 03.12.2013
comment
Спасибо, продавец лодок ... вы используете BizTalk для отправки данных на SQL Server, а затем извлекаете дельты для обработки? Моя идея заключалась в том, чтобы сначала разобрать входящий CSV в XML (используя наш настраиваемый компонент-преобразователь XSLT), а затем передать уникальный идентификатор записи и преобразованную строку XML в базу данных для сравнения. Это уменьшило бы количество элементов данных (мы опускаем многое из того, что было получено) и переложило бы некоторую обработку на сервер базы данных. XML для различий будет извлечен и передан в веб-службу. - person user3058145; 03.12.2013
comment
Если вы можете использовать SSIS для импорта CSV, это правильный путь. Это намного быстрее, чем синтаксический анализ ff-to-xml, и на самом деле именно для этого и предназначен SSIS. Я стараюсь сохранить все установленные сравнения в базе данных, так как это лучший инструмент. Иногда это сравнение всей строки, иногда сравнение идентификаторов. Это зависит от конкретных обстоятельств. - person Johns-305; 03.12.2013

Компоненту, который выполняет распаковку, необходимо будет опубликовать сообщение о начале пакетной обработки с количеством отдельных записей и ключом корреляции.

Компоненты, выполняющие вставку и обновление, должны будут опубликовать сообщение о завершении с тем же ключом корреляции после завершения обработки.

Начало пакетного сообщения вызвало бы оркестровку, которая будет прослушивать сообщения о завершении с этим ключом корреляции и подсчитывать число, и либо после получения правильного числа, либо после периода тайм-аута вызывала бы очистку или вызывала исключение.

person Dijkgraaf    schedule 02.12.2013
comment
Спасибо, Дийкграаф ... Мне нравится идея ключа корреляции и количества записей. Единственная проблема, с которой я столкнулся, - это сбои и идея тайм-аута. Из-за различий в нагрузке на сервер и количестве записей в файле, я думаю, может быть сложно настроить надежный тайм-аут. Есть ли способ поймать и подсчитать неудачные записи, а также успешные? Было бы здорово учитывать все записи (т.е. успешный счет + неудачный счет = общее количество записей). - person user3058145; 03.12.2013
comment
Это зависит от типа отказа. Если процесс, который вставляет и обновляет, является оркестровкой, вы, безусловно, можете обнаружить там сбои и иметь в своем сообщении о завершении флаг успешного выполнения. Если вы не используете оркестровку для этого процесса, вам понадобится что-то, подписывающееся на сообщение об ошибке. - person Dijkgraaf; 04.12.2013