Цикл обезвоживания и увлажнения Biztalk

У меня есть простое приложение Biztalk 2013-r2, которое импортирует файл в таблицу, а затем выполняет длительный процесс пост-импорта (через хранимые процедуры).

Симптомы: при импорте 2 файлов

  • Импорт первого файла не имеет проблем
  • Затем начинается постобработка (медленная, как и ожидалось, из-за длительной хранимой процедуры).
  • Затем, если вы отбросите второй файл, постобработка первого файла исчезнет, ​​и произойдет второй импорт.
  • Затем они начинают чередоваться взад и вперед (вы можете видеть, что поле постобработки заполняется, как и ожидалось)
  • Оба порта отправки активны, иногда вы видите обезвоживание третьего

Поскольку об ошибках не сообщается, это должна быть настройка или мне нужно перенести постобработку из длительной транзакции?

Подробности:

  • Тип транзакции Orchestration долго выполняется
  • Время ожидания для порта отправки постобработки составляет 59 минут.
  • Хранимая процедура постобработки вызывает дочерние хранимые процедуры.
  • Нигде не сообщается об ошибках
  • Оба порта отправки заказали доставку проверенной

введите здесь описание изображения

Хранимые процедуры постобработки:

    CREATE PROCEDURE [sync].[MPostProcessing]
        @Code NVARCHAR(2)
    AS 

    ----
    ---- 2. Normalize Address
    ----
    IF @Code = '99'
        EXEC sync.AElBatch @Code = @Code


CREATE PROCEDURE [sync].[AElBatch ] @Code AS VARCHAR(2)
AS 
    DECLARE @ID AS INT

    WHILE EXISTS ( SELECT   ID
                   FROM     sync.[mtable]
                   WHERE    Code = @Code
                            AND PostProcessingDone = 0 ) 
        BEGIN

            SELECT TOP 1
                    @ID = ID
            FROM    sync.[mtable]
            WHERE   Code = @Code
                    AND PostProcessingDone = 0



            EXEC sync.PParse @ID = @ID


            UPDATE  sync.[mtable]
            SET     PostProcessingDone = 1
            WHERE   Code = @Code
                    AND ID = @ID

        END

Затем хранимая процедура PPARse делает больше (все работает, ошибок нет)

Изображение консоли администрирования Biztalk Server

введите здесь описание изображения


person Internet Engineer    schedule 01.02.2016    source источник
comment
Мне не совсем понятен ваш вопрос. Вы говорите, что ошибок нет, и вся обработка прошла успешно — вы просто хотите знать, почему существует цикл гидратации/дегидратации?   -  person Dan Field    schedule 02.02.2016
comment
Затем, если вы перетащите второй файл, постобработка первого файла исчезнет, ​​и произойдет второй импорт. Затем они начинают чередоваться взад и вперед (вы можете видеть, что поле постобработки заполняется, как и ожидалось)   -  person Internet Engineer    schedule 02.02.2016
comment
Загрузка первого файла не завершается?   -  person Dan Field    schedule 02.02.2016
comment
Только часть загрузки файла завершена, постобработка находится на полпути, когда все строки удаляются для импорта второго файла.   -  person Internet Engineer    schedule 02.02.2016
comment
Также оба порта отправки: импорт и постобработка активны в консоли администрирования Biztalk Server.   -  person Internet Engineer    schedule 02.02.2016
comment
Просто добавил образ консоли администратора   -  person Internet Engineer    schedule 02.02.2016


Ответы (1)


Так что это слишком долго для комментария, но я все еще не уверен на 100% в вашей проблеме. Так или иначе:

Похоже, у вас, вероятно, есть проблемы с вашими SP. Рефакторинг их для использования запросов на основе наборов вместо циклов while (или курсоров, если они у вас есть). Принуждение SQL Server к обработке каждой отдельной скалярной переменной как отдельного вызова не позволит ему полностью оптимизировать все, что он делает в sync.PParse - передайте ему табличную переменную или что-то еще, если вам нужно, чтобы он мог правильно распараллелить ее и перестать задерживать вещи, поэтому плохо.

Вполне возможно, что в sync.PParse есть ошибка, которая считывает данные, которых не должно быть. Особенно беспокоят эти строки из AElBatch:

        SELECT TOP 1
                @ID = ID
        FROM    sync.[mtable]
        WHERE   Code = @Code
                AND PostProcessingDone = 0

Вы, вероятно, захотите добавить туда какой-нибудь идентификатор пакета, чтобы PostProcessing#2 не начал собирать то, что на самом деле предназначалось для PostProcessing#1.

Дважды проверьте, что происходит с sp_who2, посмотрите, не блокируется ли что-то. Вполне вероятно, что там что-то происходит, даже если ошибки не появляются должным образом.

В конце концов, если ничего из этого не работает, вам, возможно, придется превратить их в один SP, который вызывается BizTalk, чтобы Ordered Delivery сохранял оба задания в одной очереди, вместо того, чтобы разрешить завершение загрузки файла №2 до задания постобработки №1. сделано.

person Dan Field    schedule 02.02.2016