3

MSMQ 携带的消息是否可以有多个侦听器?

WCF 似乎在服务方面构建了一切,使通信成为点对点事务。我想使用消息队列来缓冲另一个进程的传入流量,该进程在数据库中记录日志。

可能有任何数量的其他进程对监视传入流量感兴趣,这肯定需要观察者模式,但我看不出如何表达观察者模式,至少不通过 WCF 使用 MSMQ。

谁能给我建议?


关于我为什么关心的一些背景,这也可能有助于说明问题:我有一个 Windows 服务,它接受来自现场小黑盒的连接请求。它设置套接字,黑匣子发送描述事件的消息,并在时间和空间上用 GPS 位置进行注释。

我从套接字流中解析消息包,并通过 MSMQ 将它们发送到另一个过滤重复数据包并将数据包写入数据库表的进程。

任何数量的后处理都将受益于响应传入流量的增量计算,并且用户工具也会执行用户通知以响应传入流量。

所以,我真的很想让一个进程发送消息,而几个进程接收它们。其中一个接收器负责解析数据包内容并将消息转录到数据库中;这显然是最终从队列中删除消息的责任的候选者,但问题是如何确保这是处理消息的最后一个处理程序。

4

2 回答 2

3

我不相信 MSMQ 被适当地设计为自行处理这种情况。您只能对消息执行 2 件事 - Peek() 或 Get()。AFAIK,没有很好的方法来跟踪消息是否已被所有处理程序处理。

可能的工作是让您转录消息的过程成为被观察者,并在转录消息并写入数据库之前将消息发布(可能使用 .NET 事件架构)给所有感兴趣的观察者。这将保证所有感兴趣的观察者都能看到消息,并且消息会被适当地写入数据库。

于 2008-10-29T21:56:55.453 回答
0

我认为您需要一个Publish-Subscribe Channel

发送者如何向所有感兴趣的接收者广播事件? 在 Publish-Subscribe Channel 上发送事件,该通道将特定事件的副本传递给每个接收者。

Publish-Subscribe Channel 的工作原理如下:它有一个输入通道,该通道分为多个输出通道,每个订阅者一个。当事件发布到通道中时,发布-订阅通道将消息的副本传递到每个输出通道。每个输出通道只有一个订阅者,只允许使用一次消息。这样,每个订阅者只收到一次消息,并且消费的副本从他们的频道中消失。

此模式由MassTransitNServiceBus在 MSMQ 之上实现。

于 2013-01-24T21:15:34.853 回答