使用WCF MSMQ的观察者模式

3

是否可以在MSMQ中有多个侦听器来监听消息?

WCF似乎将一切都围绕着服务进行,使通信成为点对点的事务。我想使用消息队列来缓存传入的流量,以备另一个进程将日志记录到数据库中。

可能有许多其他进程对监视传入流量感兴趣,这绝对需要观察者模式,但是我不知道如何表达观察者模式,至少不是通过MSMQ via WCF。

有人能给我提供建议吗?


以下是我关心的一些背景,这也可以说明问题:我有一个Windows服务,接受来自现场小黑盒子的连接请求。它设置套接字,黑盒子发送描述带有GPS位置和时间空间注释的事件的消息。

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

有许多后处理可以从增量计算中受益,并且用户工具也会响应传入的流量执行用户通知。

因此,我真的希望有一个进程发送消息,而有几个进程接收消息。其中之一负责解析数据包内容并将消息转录到数据库中;这是最后从队列中删除消息的责任的明显候选者,但问题在于如何确保这是最后一个处理消息的处理程序。

2个回答

3
我不认为MSMQ单独处理这种情况是适当的设计。你只能对消息执行两个操作-Peek()或Get()。据我所知,并没有一种好的方法来跟踪是否所有处理程序都已处理该消息。
可能行得通的做法是将转录消息的进程作为被观察者,并在转录消息并写入数据库之前将消息(可能使用.NET事件架构)发布给所有感兴趣的观察者。这将确保所有感兴趣的观察者都看到了消息,并且消息会被适当地写入数据库。

Harper,这正是我最终所做的。我创建了两个接口,IPublisher和ISubscriber,并使用双工绑定。记录器是MSMQ端点,在数据安全地存入数据库后,它会通知任何订阅者。 - Peter Wone

0

我认为你需要一个发布-订阅通道

发送者如何向所有感兴趣的接收者广播事件? 将事件发送到发布-订阅通道,该通道将特定事件的副本传递给每个接收者。

发布-订阅通道的工作原理如下:它有一个输入通道,分成多个输出通道,每个订阅者都有一个输出通道。当事件发布到通道中时,发布-订阅通道将消息的副本传递到每个输出通道。每个输出通道只有一个订阅者,该订阅者只能消费一次消息。通过这种方式,每个订阅者仅收到一次消息,并且已消耗的副本会从其通道中消失。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接