我已经尝试了MsmqIntergrationBinding和NetMsmqBinding,但我正在努力实现我的异步处理事务性WCF MSMQ部分排序消息的目标。
我想使用WCF来侦听事务队列上的消息。为了处理该消息,我基于消息内容将输入消息解复用到各种(内存中)队列中。消息以异步方式处理时,MSMQ事务保持打开状态,但WCF Dispatcher可以继续接受任何下一条消息。队列<>'d,解复用的消息需要包含在完全处理后提交或回滚MSMQ事务所需的句柄。完成对Process()的WCF回调MSMQ不应该等待处理异步消息,也不应该在异步操作完成之前提交事务。消息在“会话”中具有部分排序,当从MSMQ读取到队列<>时,应该保留该消息。
障碍是我无法弄清楚如何在不阻止WCF的情况下保持事务处理打开,我无法弄清楚如何在没有单线程WCF的情况下维护部分排序。如果我可以维护事务但是释放一个单线程的WCF调度程序继续下一个msmq.Receive(),一旦我只是在内存中排队<>'d项目(用它的开放事务)我想我好的。
我尝试过转换TransactionAutoComplete = false,但这会产生一系列令人讨厌的后果,包括强制InstanceContextMode = PerSession,因此只需要与MsmqIntegrationBinding相比我不喜欢的NetMsmqBinding。另外,除非我在Process()操作上有IsTerminating = true,否则我根本无法提交事务。无论如何,PerSession似乎是一个不合适的选择。然而,我仍然被打败:如果我试图将operationContext = OperationContext.Current
传递给异步处理,它似乎失去了一些重要的内部因素,因为当我试图operationContext.SetTransactionComplete();
说没有任何交易要完成时我会收到错误。
[OperationContract(IsOneWay = true, Action = "*", IsTerminating = true)]
void Process(M msg);
我可以线程等待WCF的Process()调用,直到异步操作发出信号表明它们已经完成,但这实际上需要多线程WCF并且会导致部分排序要求。
想法?
答案 0 :(得分:2)
障碍是我无法弄清楚如何在不阻止WCF的情况下保持交易开放
这是一个问题。
你专门处理一个队列。它是一种固有的有序结构,保证“先进先出”。您正在处理事务性,这意味着如果有回滚,则需要将消息放回队列的头部。
如何在完成第一条消息之前处理队列中的第二条消息 - 在回滚的情况下会发生什么?