Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 基于WCF-MSMQ的观测器模式_.net_Wcf_Msmq_Observer Pattern - Fatal编程技术网

.net 基于WCF-MSMQ的观测器模式

.net 基于WCF-MSMQ的观测器模式,.net,wcf,msmq,observer-pattern,.net,Wcf,Msmq,Observer Pattern,MSMQ携带的消息是否可能有多个侦听器 WCF似乎用服务来构建一切,使通信成为点对点的事务。我想使用消息队列为另一个在数据库中记录日志的进程缓冲传入流量 可能有很多其他进程对监控传入流量感兴趣,这就需要观察者模式,但我不知道如何表达观察者模式,至少不通过WCF使用MSMQ 有人能给我提供这方面的建议吗 我关心的一些背景知识,也可以用来说明问题:我有一个Windows服务,它接受来自现场小黑匣子的连接请求。它设置插座,黑匣子发送消息,描述带有GPS时间和空间位置注释的事件 我解析套接字流中的消息

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

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

可能有很多其他进程对监控传入流量感兴趣,这就需要观察者模式,但我不知道如何表达观察者模式,至少不通过WCF使用MSMQ

有人能给我提供这方面的建议吗


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

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

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


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

我认为MSMQ本身并不适合处理这种情况。对消息只能执行两种操作-Peek()或Get()。顺便说一句,没有一种好方法可以跟踪消息是否已被所有处理程序处理

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

我认为您需要一个:

发送者如何向所有感兴趣的接收者广播事件? 在发布-订阅频道上发送事件,该频道提供特定事件的副本 事件发送给每个接收器

发布-订阅通道的工作原理如下:它有一个输入通道 分为多个输出通道,每个用户一个。 将事件发布到通道中时,发布订阅 通道将消息的副本传递到每个输出通道。 每个输出通道只有一个订户,只允许 消费一次消息。这样,每个订阅者只获得 消息一次,已消费的副本将从其通道中消失


这个模式是由和在MSMQ之上实现的。

Harper,这正是我最终要做的。我创建了两个接口,ippublisher和ISubscriber,以及一个双工绑定。记录器是MSMQ端点,在数据安全地保存在数据库中后,它会通知所有订阅者。