异步处理事务性WCF MSMQ部分排序消息



我尝试过msmqintegrationbinding和NetMsmqBinding,但是我很难实现异步处理事务性WCF MSMQ部分有序消息的目标。

我想使用WCF来监听事务队列上的消息。为了处理消息,我根据消息内容将传入的消息解复用到各种(内存中的)Queue<>s中。当消息被异步处理时,MSMQ事务保持打开状态,但是WCF Dispatcher可以自由地继续接受任何下一个消息。Queue<> d解复用消息需要包含在完全处理后提交或回滚MSMQ事务所需的句柄。对Process()的WCF回调完成后,MSMQ不应该等待异步消息被处理,也不应该在异步操作完成之前提交事务。消息在"会话"中具有部分排序,当从MSMQ读取到Queue<>时,应该保留该排序。

障碍是我无法弄清楚如何在不占用WCF的情况下保持事务打开,并且我无法弄清楚如何在没有单线程WCF的情况下维护部分排序。如果我可以维护事务,但释放一个单线程WCF调度程序移动到下一个msmq.Receive()一旦我仅仅在内存中Queue<> d项目(与它的开放事务),我想我会好的。

我试过把TransactionAutoComplete = false,但这有一个讨厌的后果链,包括强迫InstanceContextMode = PerSession,因此只需要NetMsmqBinding,我不喜欢与MsmqIntegrationBinding相比。此外,除非在Process()操作上设置了istterminate = true,否则根本无法提交事务。无论如何,人格似乎是一个不合适的选择。然而,我仍然失败:如果我试图将operationContext = OperationContext.Current传递给异步处理,它似乎失去了一些重要的内部特性,因为当我试图将operationContext.SetTransactionComplete();传递给异步处理时,我得到错误,说没有事务要完成。

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

我可以线程等待WCF的Process()调用,直到异步操作信号表明它们已经完成,但这实际上需要多线程的WCF,并且杀死了部分排序的要求。

想法?

障碍是我不知道如何在不占用WCF

的情况下保持事务打开。

这是个问题。

你正在处理一个队列。这是一种固有的有序结构,保证了"先进先出"。您正在以事务方式处理它,这意味着如果有回滚,则需要将消息放回到队列的头部。

在处理完队列中的第一个消息之前,如何处理队列中的第二个消息——在回滚的情况下会发生什么?

最新更新