Я пробовал 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 и убивает требование частичного упорядочения.
Идеи