Сообщение Ответ Зомби, возникающие с кодами ошибок 0xC0C01B4C и 0xc0c016b5 без согласования

Рассмотрим следующий поток сообщений в BizTalk.

У нас есть несколько портов/местоположений получения MLLP, получающих сообщения HL7v2 в одном приложении. Каждый из этих портов получает немного разные типы сообщений.

Назовем это RP1

В другом приложении у нас есть порты отправки, которые подписываются на каждый соответствующий порт приема. Каждый из этих портов отправки имеет исходящую карту, которая преобразует сообщения в HL7v3 и отправляет их в службу WCF (запрос/ответ).

Назовем это SP1

Затем служба WCF обрабатывает и проверяет HL7v3 и отправляет обратно сообщение подтверждения HL7v3. Порт отправки SP1 имеет настраиваемые компоненты конвейера отправки и получения. Получение (из ответа WCF) просто принимает сообщение и продвигает определенные поля, которые будут использоваться позже для подписок.

Затем есть еще два порта отправки. SP2, который подписывается на положительные ACK. SP3 на отрицательный на основе полей, продвинутых выше. Положительные ACK просто потребляются, а отрицательные ACK отправляются по электронной почте в службу поддержки.

Проблема в том, что примерно в 10% сообщений появляется одно из этих двух сообщений об ошибках:

A response message for two-way receive port "SP.CDX.LAB_MICRO.SubmitCDA.WCFCustom" is being suspended as the messaging engine could not correlate the response to an existing request message. This usually happens when the host process has been recycled.
MessageId:  {731623F3-995B-4C57-BD21-12865AD78717}
InstanceID: {084BD473-C857-4C5E-A49B-8A86EA2CAC39}
The following stored procedure call failed: " { call [dbo].[bts_UpdateMsgbox_BizTalkServerReceive]( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}". SQL Server returned error string: "The statement has been terminated.;Cannot insert duplicate key row in object 'dbo.InstancesSuspended' with unique index 'IX_InstancesSuspended_InstanceID'. The duplicate key value is (084bd473-c857-4c5e-a49b-8a86ea2cac39, afa466c7-3bd2-4cde-a293-3df3fb5d8543)."

Обычно за этим следует приостановленный экземпляр службы в средстве просмотра группы:

 The instance completed without consuming all of its messages. The instance and its unconsumed messages have been suspended

Имя службы приостановленного экземпляра — это имя службы RP1. Тип сообщения неиспользованного сообщения — это тип ACK из пакета обновления 1 (поэтому это ответ WCF). Это странно, потому что, на мой взгляд, RP1 никогда не должен ожидать этого ответного сообщения, И существуют порты отправки (SP2, SP3), подписанные на типы ответных сообщений.

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

BizTalk Server установлен на 2 физических серверах, совместно использующих 1 BizTalkMgmtDb/Messagebox.

До этого у нас было такое же количество поступающих сообщений, но оно было объединено (на стороне отправки) в одно место получения. В старом решении было несколько оркестраций, но эта проблема никогда не возникала.

Почему теперь ответные сообщения WCF (HL7v3) теряются и приостанавливаются в экземпляре RP1 (HL7v2)?

Вот основное изображение того, как это выглядит.

макет biztalk


person Bensonius    schedule 22.05.2015    source источник
comment
Установлен ли для вашего принимающего порта RP1 режим HL7 Enhanced Commit ACK? Или это приложение принимает ACK или статический ACK?   -  person Dijkgraaf    schedule 24.05.2015
comment
Я не уверен, где именно это проверить, но я предполагаю, что вы говорите о конфигурации партии? Если это так, у нас есть партия, и на вкладке «Подтверждение» она установлена ​​​​в «Исходный режим», а на карте MSH это MSH.15 — это AL, а MSH.16 — это NE.   -  person Bensonius    schedule 24.05.2015
comment
Нет, по-видимому, они настроены на уровне хоста/адаптера BizTalk. См. msdn.microsoft.com/en-us/library/ee404914.aspx   -  person Dijkgraaf    schedule 24.05.2015
comment
Я прочитал это, но не смог найти ничего на уровне хоста или адаптера (адаптер MLLP имеет свойства максимального количества подключений. Мне интересно, была ли эта документация написана много дней назад?   -  person Bensonius    schedule 24.05.2015
comment
Я никогда не устанавливал ускоритель для HL7, поэтому не могу легко проверить. Является ли ваш порт приема односторонним или двусторонним?   -  person Dijkgraaf    schedule 24.05.2015
comment
Может быть, ваши экземпляры получают один и тот же ключ (идентификатор сообщения) разных сообщений от отправителей MLLP или генерируют один и тот же ключ во время преобразования разных сообщений?   -  person sqlab    schedule 26.05.2015


Ответы (2)


Я смог исправить это, изменив значение значения RouteDirectToTP в свойствах контекста сообщения с двумя ответами WCF. На основе информации в этих сообщениях:

https://jeremiedevillard.wordpress.com/2010/01/11/how-work-request-response-pattern-part-3/

https://bveldhoen.wordpress.com/2010/09/05/messaging-only-request-response-correlation/

По-видимому, по умолчанию BizTalk пытается направить ACK обратно на исходный порт получения по умолчанию. Я только что сделал это в своем конвейерном компоненте:

 msgReceived.Context.Promote("RouteDirectToTP", "http://schemas.microsoft.com/BizTalk/2003/system-properties", false);

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

person Bensonius    schedule 26.05.2015

Обработка адаптера получения MLLP

Подтверждения с адаптером двустороннего приема MLLP

Когда адаптер двустороннего приема MLLP получает сообщение, Microsoft BizTalk Accelerator для HL7 (BTAHL7) может генерировать следующие типы подтверждений подтверждения:

  • HL7 Enhanced Commit ACK: в этом сценарии BTAHL7 отправляет Commit ACK по тому же соединению. Он отправляет Application Accept ACK на другой порт отправки.

  • Application Accept ACK: В этом сценарии BTAHL7 отправляет Application Accept ACK по тому же соединению.

  • Статический ACK: в этом сценарии BTAHL7 отправляет ACK по тому же соединению.

  • Тип генерируемого ACK зависит от настроек обозревателя конфигурации BTAHL7 для стороны, отправляющей сообщение. Значение в полях MSH 15 и 16 отдельного сообщения может переопределить этот параметр. Однако для приложений, ожидающих статических подтверждений подтверждения, конфигурацию можно задать только с помощью обозревателя конфигураций BTAHL7.

Прочитав это, я подумал, что вам нужно настроить адаптер на HL7 Enhanced Commit ACK.

person Dijkgraaf    schedule 24.05.2015
comment
Это имеет смысл и для меня. Я настроил свои стороны на Enhanced Commit ACK, но это все еще происходит. Мне нужно уточнить, что ACK, который приостановлен, не является ACK HL7v2, это ACK HL7v3 от восходящей службы WCF. - person Bensonius; 25.05.2015