首页 文章

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

提问于
浏览
2

我已经尝试过MsmqIntergrationBinding和NetMsmqBinding,但我正在努力实现我的异步处理事务性WCF MSMQ部分排序消息的目标 .

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

障碍是我无法弄清楚如何在不阻止WCF的情况下保持事务处理打开,我无法弄清楚如何在没有单线程WCF的情况下维护部分排序 . 如果我可以维护事务但是释放一个单线程的WCF调度程序来继续下一个msmq.Receive(),一旦我只是将内存中的项目排队<>',那么我认为我是好的

我已经尝试过转换TransactionAutoComplete = false,但这会产生一系列令人讨厌的后果,包括强制InstanceContextMode = PerSession,因此只需要NetMsmqBinding,而不是MsmqIntegrationBinding . 此外,除非我在Process()操作中具有IsTerminating = true,否则我根本无法提交事务 . 无论如何,PerSession似乎是一个不合适的选择 . 然而,我仍然被打败:如果我试图将 operationContext = OperationContext.Current 传递给异步处理,它似乎失去了一些重要的内部因素,因为当我尝试 operationContext.SetTransactionComplete(); 表示没有任何事务要完成时我会收到错误 .

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

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

想法?

1 回答

  • 2

    障碍是我无法弄清楚如何在不阻止WCF的情况下保持交易开放

    那是个问题 .

    你're specifically dealing with a queue. It'是一个固有的有序结构,保证"first in, first out" . 您正在以事务方式处理它,这意味着如果存在回滚,则需要将消息放回队列的头部 .

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

相关问题