【问题标题】:Observer pattern with WCF MSMQ使用 WCF MSMQ 的观察者模式
【发布时间】:2008-10-29 21:43:46
【问题描述】:

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

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

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

谁能给我建议?


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

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

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

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

【问题讨论】:

    标签: .net wcf msmq observer-pattern


    【解决方案1】:

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

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

    【讨论】:

    • 哈珀,这正是我最终所做的。我创建了两个接口,IPublisher 和 ISubscriber,以及一个双工绑定。记录器是 MSMQ 端点,在数据安全地存储在数据库中后,它会通知任何订阅者。
    【解决方案2】:

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

    发送者如何向所有感兴趣的接收者广播事件? 在 Publish-Subscribe Channel 上发送事件,该频道提供特定的副本 事件到每个接收者。

    发布-订阅通道的工作方式如下:它有一个输入通道 分成多个输出通道,每个订阅者一个。 当一个事件被发布到频道中时,Publish-Subscribe 通道将消息的副本传递到每个输出通道。 每个输出通道只有一个订阅者,只允许 消费一次消息。这样,每个订阅者只获得 消息一次,消费的副本从他们的频道中消失。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 2023-04-10
      • 1970-01-01
      • 2013-03-05
      • 2013-01-01
      • 2013-02-12
      • 2016-05-11
      相关资源
      最近更新 更多