Обработка транзакционных WCF MSMQ частично упорядоченных сообщений асинхронно - PullRequest
2 голосов
/ 17 ноября 2011

Я пробовал MsmqIntergrationBinding и NetMsmqBinding, но изо всех сил пытаюсь достичь своей цели - обрабатывать транзакционные частично упорядоченные сообщения WCF MSMQ асинхронно.

Я хочу использовать WCF для прослушивания сообщений в транзакционной очереди. Чтобы обработать сообщение, я демультиплексирую входящее сообщение в различные (в памяти) очереди <> на основе содержимого сообщения. Транзакция MSMQ остается открытой, пока сообщение обрабатывается асинхронно, но диспетчер WCF может свободно принимать любое следующее сообщение. Очереди <> 'd, демультиплексированные сообщения должны содержать дескрипторы, необходимые для фиксации или отката транзакции MSMQ после полной обработки. Завершение обратного вызова WCF для Process () MSMQ не должно ждать обработки асинхронного сообщения и не должно фиксировать транзакцию до завершения асинхронных операций. Сообщения имеют частичный порядок в «разговорах», которые следует сохранять при их чтении из MSMQ в очередь <>.

Препятствием является то, что я не могу понять, как сохранить транзакцию открытой, не удерживая WCF, и я не могу понять, как поддерживать частичное упорядочение без однопотокового WCF. Если я смогу поддерживать транзакцию, но освободить однопоточный диспетчер WCF, чтобы перейти к следующему msmq.Receive (), как только я просто поставлю в очередь <> элемент в памяти (с открытой транзакцией), я думаю, я бы быть в порядке.

Я пытался включить TransactionAutoComplete = false, но это имело неприятную цепочку последствий, включая принудительное использование InstanceContextMode = PerSession и, следовательно, требовало только NetMsmqBinding, что мне не нравится по сравнению с MsmqIntegrationBinding. Кроме того, я не могу зафиксировать транзакцию вообще, если у меня нет IsTerminating = true в операции Process (). В любом случае PerSession кажется неуместным выбором. И все же я остаюсь побежденным: если я попытаюсь передать operationContext = OperationContext.Current асинхронной обработке, он, похоже, потеряет некоторые важные внутренние компоненты, потому что я получаю ошибки, когда пытаюсь operationContext.SetTransactionComplete(); сказать, что транзакция не будет завершена.

[OperationContract(IsOneWay = true, Action = "*", IsTerminating = true)]
void Process(M msg);

Я мог бы поточно ожидать вызова процесса () WCF до тех пор, пока асинхронные операции не сообщат о том, что они завершены, но это практически требует многопоточного WCF и убивает требование частичного упорядочения.

Идеи

1 Ответ

2 голосов
/ 18 ноября 2011

Препятствие состоит в том, что я не могу понять, как сохранить транзакцию открытой, не удерживая WCF

Это проблема.

Вы имеете дело сочередь.Это изначально упорядоченная структура, которая гарантирует «первым пришел - первым вышел».Вы имеете дело с этим транзакционно , что означает, что при наличии отката сообщение должно быть возвращено в начало очереди.

Как вы можете обработать второе сообщение вочередь до того, как вы закончили с первой - что произойдет в случае отката?

...