MSMQ查询特定消息

时间:2009-12-16 07:32:15

标签: msmq

我有关于MSMQ的任务...... 我设计了一个像这样的异步架构:

CLient - > WCF服务(托管在WinService中) - > MSMQ

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

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

3 个答案:

答案 0 :(得分:6)

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

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

编辑:如果您的客户指示实施细节对他们自己有害,那么您真的只有三种方法可以去:

  1. 解决它们。在这种情况下,这可能涉及使用SQLite数据库 - 它只是一个文件,客户端可能甚至不会将其视为“数据库”。
  2. 深入探究并找出潜在问题是什么,即。 为什么他们不想使用数据库?他们真正的担忧和基本假设是什么?
  3. 接受一个糟糕的解决方案并向客户解释这是由于他们自己的限制。这永远不会好,也绝不容易,所以它真的是最后的手段。

答案 1 :(得分:5)

您可以使用

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

通过Id接收:

mq.ReceiveById(yourId);

答案 2 :(得分:3)

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

message = queue.ReceiveByCorrelationId(correlationId);

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

Guid()\\Number