2016-07-12 3 views
0

Я не уверен, что я делаю это правильно.Пользовательское подтверждение для входящих сообщений

Наша оркестровка выглядит следующим образом:

ReceiveOrder 
TryScope (Long Running) 
    AcknowledgementScope (Atomic) 
    ConstructOrderAckMessage 
     TransformOrderToAck (using a map) 
    SendOrderAckToMessageQueue 
    AtomicWebServiceScope 
     ImportOrderToDBExpression 
    Construct and send message to another process 
CatchException 
     ConstructErrorExpression 
     HandleExceptionStartOrchestration 

Когда мы проверили это около 6000 заказов, мы заметили, что все они привели в сообщении подтверждения (SendOrderAckToMessageQueue). Подтверждение представляет собой простой XML, основанный на схеме, предоставленной экипажем, который отправляет заказ на эту оркестровку.

Однако не все из них были импортированы в базу данных (ImportOrderToDBExpression) (около 45). На самом деле, нет ошибок или сбоев или приостановленных экземпляров любого рода. В заказах, которые не импортировались, нет ничего необычного. Если это не удавалось, оно делало это тихо.

Обратите внимание, что часть AcknowledgementScope - это что-то добавленное недавно; до этого все заказы были успешно импортированы.

Это потому, что у меня есть область, установленная неправильно в этой оркестровке? Где еще может быть проблема? Есть ли лучший способ отправить подтверждение в дурацкое доказательство? Спасибо за любой совет.

+0

Как выполняется InportOderToDBExpression? Это через порт отправки или вы что-то делаете в коде? – Dijkgraaf

+0

Также вы отправляете сообщение Ack перед вставкой. Также почему вы используете Atomic? – Dijkgraaf

+0

Спасибо @Dijkgraaf. ImportOrder выполняется с использованием SP, вызванного из .DLL, на который ссылается проект приложения BizTalk. Не задействован порт отправки. Все это делается с помощью кода в этом выражении. Требование было отправить подтверждение, как только поступило входящее сообщение. Нет особых причин для атомной сферы. – FMFF

ответ

1

Вы не упомянете о каких-либо уловках. У вас есть Catch Blocks на всех ваших объектах?

Если существует исключение без блока Catch или Catch Block, который не регистрирует Исключение, он будет казаться, что он не работает.

+0

Спасибо @ Johns-305 У меня нет блокировки для всех моих областей. В нижней части оркестровки есть только одно исключение Catch. – FMFF

+0

Хорошо, если вы не регистрируете ошибку там, вы ничего не увидите. –

+0

Благодаря @ Johns-305 ошибки регистрируются в журнале событий, а также записываются в таблицу в БД; Я просто не мог найти никаких ошибок, зарегистрированных в любом из этих мест. – FMFF

1

Да, главное, что вы делаете неправильно, это вызов внешней DLL для вставки записей в базу данных.

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

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

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

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

Отправка подтверждения после того, как приложение BizTalk Orchestration получило сообщение в порядке, до тех пор, пока вы можете каким-то образом возобновить сообщение об ошибке в BizTalk, так что вам нужно иметь какой-то механизм повтора.