我有关于MSMQ的任务...... 我设计了一个像这样的异步架构:
CLient - > WCF服务(托管在WinService中) - > MSMQ
所以基本上WCF服务接收请求,处理它们,将它们添加到INPUT队列并返回GUID。相同的WCF服务(通过侦听器)从队列中获取第一条消息(执行一些操作......)然后将其放回另一个队列(OUTPUT)。
问题是如何在客户端请求时从OUTPUT队列中检索结果...因为MSMQ不允许随机访问它的消息,唯一的解决方案是遍历所有消息并将其推回直到找到我需要的那个。我不想在这个OUTPUT队列中使用DB,因为客户端强加了一些限制......
答案 0 :(得分:6)
队列本质上是一种“先入先出”的数据结构,而您想要的是“随机访问”数据结构。它不是为你想要在这里实现的目标设计的,所以没有任何“干净”的方法来做到这一点。即使有办法,也会是黑客攻击。
如果您详细说明客户施加的限制,也许还有其他选择。 为什么你不想使用数据库?您是否可以使用本地SQLite数据库,甚至可以使用内存中的数据库?
编辑:如果您的客户指示实施细节对他们自己有害,那么您真的只有三种方法可以去:
答案 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