Могу ли я изменить поведение при обработке сообщений MSMQ с помощью службы Workflow? - PullRequest
0 голосов
/ 12 мая 2011

У меня есть служба Workflow, у которой есть несколько получателей, которые прослушивают очереди MSMQ. Я хотел бы реализовать следующее поведение:

  1. Если возникает исключение корреляции (т. Е. Экземпляр рабочего процесса пропал), выбросьте сообщение.
  2. Если возникает исключение InstanceLockException (т. Е. Этот экземпляр рабочего процесса делает что-то на другом сервере), поместите сообщение в очередь повторных попыток.

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

Без TransactedReceiveScope сообщение выбрасывается при наличии исключения InstanceLockException.

Есть ли способ реализовать это поведение (возможно, с помощью расширений поведения)?

Ответы [ 3 ]

1 голос
/ 13 мая 2011

Вы можете реализовать IErrorHandler для WCF , чтобы перехватывать все необработанные исключения, генерируемые вашим приложением или WCF.Вы должны быть осторожны с netMsmqBinding в том, что сброс этого обработчика означает, что сообщение было «успешно» обработано и оно будет удалено из очереди.В вашем случае, когда возникает InstanceLockException, вы должны оставить его необработанным, если вы хотите, чтобы встроенная обработка повторов MSMQ 4 происходила.Вам также необходимо разрешить необработанное исключение PoisonMessageException для правильной повторной попытки MSMQ.

0 голосов
/ 13 мая 2011

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

0 голосов
/ 12 мая 2011

Я не знаком с использованием Workflow, но, зная, как работают MSMQ и WCF, вы можете попробовать это

При возникновении исключения Correlation:

  • Поймай исключение
  • Возврат из вашего метода обслуживания

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

Когда возникает InstanceLockException:

  • Поймай исключение
  • отбросить исключение

Так как ваш метод службы генерирует исключение, он будет считать, что сообщение не было успешно обработано, и переместит его в очередь повторных попыток.

...