我试图用MSMQ传输处理WCF中的有害消息.
我按照以下链接创建了原始和毒药服务.
http://msdn.microsoft.com/en-us/library/aa395218.aspx
唯一的区别是不是自托管,而是在IIS中使用单个主机项目托管了2个服务.
两种服务的配置如下.
<services>
<service behaviorConfiguration="MainMSMQWCFService.Service1Behavior"
name="MainMSMQWCFService.OrderProcessorService">
<endpoint address="net.msmq://localhost/private/servicemodelsamplespoison"
binding="netMsmqBinding" bindingConfiguration="PoisonBinding"
contract="MainMSMQWCFService.IOrderProcessor" />
</service>
<service behaviorConfiguration="MainMSMQWCFService.PoisonHandlingServiceBehavior"
name="MainMSMQWCFService.PoisonHandlingService">
<endpoint address="net.msmq://localhost/private/servicemodelsamplespoison;poison"
binding="netMsmqBinding"
bindingConfiguration="PoisonBinding2"
contract="MainMSMQWCFService.IOrderProcessor">
</endpoint>
</service>
</services>
Run Code Online (Sandbox Code Playgroud)
两种服务都正常运行.
问题是当消息被放入毒物队列时,毒物服务不处理消息.我观察了Poison队列中的消息,它们仅针对原始服务.然后毒药服务如何处理它们?通过MSDN后,我知道通过设置服务行为属性,WCF通道会解决这个问题.以下paragraoh解释相同.
"有害消息队列中的消息是发往处理消息的服务的消息,可能与有害消息服务端点不同.因此,当有害消息服务从队列中读取消息时,WCF通道层会发现端点不匹配并且不调度消息.在这种情况下,消息被发送到订单处理服务但是被有害消息服务接收.即使消息被发送到不同的端点,也要继续接收消息,我们必须添加一个ServiceBehavior来过滤匹配条件匹配消息所针对的任何服务端点的地址.这是成功处理从有害消息队列中读取的消息所必需的.
但是我的毒药服务没有处理中毒的消息?
我无法弄清楚这个问题.
我也有同样的问题。
我想知道是否是因为在 IIS 中托管 netMsmq 服务时,队列名称必须与服务名称匹配。在初始消息队列的情况下,这是可以的(例如,队列将类似于 private/SimpleService/Service1.svc),但随后毒队列被称为 private/SimpleService/Service1.svc;poison,这显然不是匹配毒药服务名称。
我的一些示例在自行托管时运行良好。此问题似乎仅与 IIS 托管有关。
如果这是问题的话,恐怕我没有解决办法......
更新:
此评论来自
http://msdn.microsoft.com/en-us/library/ms789042(v=VS.90).aspx
表明问题正如我所想:
“WAS 托管的应用程序无法根据系统队列(例如系统范围的死信队列)或子队列(例如有毒子队列)中的消息来激活。这是该版本产品的限制”
我认为不可能指定替代的自定义有害消息队列,因此替代方案是:
1) 在服务实现中编写代码,以便在出现故障时将消息移动到备用队列 2) 使用触发器将消息从有害消息队列传输到另一个队列,并让 IIS 托管服务侦听该消息 3) 将有害消息服务托管在自定义 EXE 而不是 IIS
| 归档时间: |
|
| 查看次数: |
2955 次 |
| 最近记录: |