【问题标题】:MSMQ querying for a specific messageMSMQ 查询特定消息
【发布时间】:2010-12-27 03:28:03
【问题描述】:

我有一个关于 MSMQ 的问题... 我设计了一个这样的异步架构:

客户端 -> WCF 服务(托管在 WinService 中) -> MSMQ

所以基本上 WCF 服务接收请求、处理它们、将它们添加到 INPUT 队列并返回 GUID。相同的 WCF 服务(通过侦听器)从队列中获取第一条消息(做一些事情......),然后将其放回另一个队列(OUTPUT)。

问题是当客户端请求时如何从 OUTPUT 队列中检索结果...因为 MSMQ 不允许随机访问它的消息,唯一的解决方案是遍历所有消息并将它们推回直到我找到我需要的那个。由于客户端施加的一些限制,我不想将 DB 用于此 OUTPUT 队列...

【问题讨论】:

    标签: msmq


    【解决方案1】:

    您可以使用

    在输出队列中查找您的消息
    var mq = new MessageQueue(outputQueueName);
    mq.PeekById(yourId);
    

    按 ID 接收:

    mq.ReceiveById(yourId);
    

    【讨论】:

      【解决方案2】:

      队列本质上是一种“先进先出”的数据结构,而您想要的是一种“随机访问”的数据结构。它不是为您在这里想要实现的目标而设计的,因此没有任何“干净”的方法可以做到这一点。即使有办法,那也是一种黑客行为。

      如果您详细说明客户施加的限制,也许还有其他选择。 为什么你不想使用数据库?您可以使用本地 SQLite 数据库,或者甚至是内存数据库吗?

      编辑:如果您的客户口述实施细节对自己不利,那么您实际上只有三种方法:

      1. 围绕它们工作。在这种情况下,这可能涉及使用 SQLite DB - 它只是一个文件,客户端可能甚至不会将其视为“数据库”。
      2. 深入探究并找出根本问题是什么,即。 为什么他们不想使用数据库?他们真正关心的问题和基本假设是什么?
      3. 接受一个糟糕的解决方案并向客户解释这是由于他们自身的限制。这从来都不是一件好事,也不是一件容易的事,所以它真的是不得已而为之。

      【讨论】:

      • 因为客户端不希望我们使用任何数据库(尽管我试图解释原因...)...结果列表必须在系统故障时保持不变,并且 MSMQ 消息可以设置为可恢复...
      • 我想在 MSMQ 中存储一个自定义对象(仅用于持久性),但这会引发并发访问的问题,因为我有多个线程同时运行可以访问该对象。 .在上面加个writerLock会影响整个系统的性能...
      【解决方案3】:

      您可以使用CorrelationId 并在发送消息时设置它。然后,要接收相同的消息,您可以使用ReceiveByCorrelationId 选择特定消息,如下所示:

      message = queue.ReceiveByCorrelationId(correlationId);
      

      另外,CorrelationId 是一个字符串,格式如下:

      Guid()\\Number
      

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2011-05-28
        • 2010-11-14
        • 1970-01-01
        • 1970-01-01
        • 2023-04-06
        • 2015-05-24
        • 1970-01-01
        相关资源
        最近更新 更多