是否可以为MSMQ携带的消息提供多个侦听器?
WCF似乎在服务方面构建了一切,使得沟通成为一种点对点的事情。我想使用消息队列来缓冲另一个记录数据库中日志的进程的传入流量。
可能有任何数量的其他进程对监视传入流量感兴趣,这对Observer模式有积极的要求,但我看不出如何表达Observer模式,至少不通过WCF使用MSMQ。
有人可以就此提出建议吗?
关于我关心的原因的一些背景,这也可能用于说明问题:我有一个Windows服务,接受来自该领域的小黑盒子的连接请求。它设置套接字,黑框发送描述在时间和空间中用GPS位置注释的事件的消息。
我解析来自套接字流的消息包,并通过MSMQ将它们发送到另一个过滤重复数据并将数据包写入数据库表的进程。
有任何数量的后处理可以从响应传入流量的增量计算中受益,并且用户工具也会响应传入流量执行用户通知。
所以,我真的希望有一个进程发送消息,有几个接收它们。其中一个接收器负责解析数据包内容并将消息转录到数据库中;这是最终从队列中删除消息的责任的明显候选者,但是存在如何确保这是处理消息的最后一个处理程序的问题。
答案 0 :(得分:3)
我认为MSMQ本身并不适合处理这种情况。您只能对消息执行两项操作 - Peek()或Get()。 AFAIK,没有一种好方法来跟踪所有处理程序是否已处理消息。
可能有效的是让您的流程转录消息是Observee,并在转录消息并写入数据库之前将消息(可能使用.NET事件体系结构)发布给所有感兴趣的观察者。这将保证所有感兴趣的观察者都能看到该消息,并且消息会被恰当地写入数据库。
答案 1 :(得分:0)
我认为你需要一个Publish-Subscribe Channel:
发件人如何向所有感兴趣的接收者广播事件? 在发布 - 订阅频道上发送活动,该频道提供特定的副本 每个接收者的事件。
发布 - 订阅频道的工作方式如下:它有一个输入频道 分成多个输出通道,每个用户一个。 当事件发布到频道时,发布 - 订阅 Channel将消息的副本传送到每个输出通道。 每个输出通道只有一个用户,只允许使用 消费一次消息。通过这种方式,每个用户只能得到 消息一次,消费的副本从他们的频道中消失。
此模式在MassTransit和NServiceBus的MSMQ之上实现。