首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetMsmqBinding:消息正在被多次处理

NetMsmqBinding:消息正在被多次处理
EN

Stack Overflow用户
提问于 2013-02-25 19:11:10
回答 2查看 1.1K关注 0票数 2

我的团队有一个windows服务,它使用http绑定承载wcf服务。当wcf服务接收到消息时,它会立即将其发送到另一个wcf服务,使用NetMsmqBinding,该服务也托管在windows服务中。msmq服务处理该消息并保存它以执行我们的DB。

在开发和分期环境中,一切都很好。但是,当我们部署到生产中时,我们看到发送到服务的消息被乘以n+1因子(对于n条消息)。

例如:收到1条消息,将2条保存到DB。收到4条消息,20条保存到DB等。

我们怀疑它与事务的msmq服务设置有关,

并发性和InstanceContextMode,但是我们无法解决它。

该服务的设置如下:

  • InstanceContextMode:默认。
  • ConcurrenyMode:默认
  • 事务: TransactionScoreRequired = True和TransactionAutoComplete = True。
  • RetryCount = 1,RetryCycles =1

我们使用.Net 4,MSMQ3.0和Windows 2003。

对什么会导致这个问题有什么想法吗?

编辑:

经过大量的研究,我们发现了以下几点:

  • 当wcf运行时试图为单个消息提交事务时,它会抛出“事务异步中止”的异常。每次重复消息时都会引发此异常。
  • 在wcf跟踪中,除了上面所述的异常之外,我们没有看到任何其他异常。
  • 在System.Transaction跟踪中,我们看到一个事务正在被打开(对于第一条消息),然后在wcf运行时创建了该事务的克隆(带有属性RollbackIfNotCompleted=true)之后,在跟踪中没有消息的情况下,几秒钟就过去了,然后同样的事情再次发生。

我们真的很无知..。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-04 18:05:10

嗯,我们终于得到了它:我们使用Entlib进行日志记录,并添加了一个DB侦听器。Entlib DB侦听器使用服务的相同事务。当它试图将事务传递给DB服务器时,会引发一个错误,因为MSDTC没有在DB服务器上正确配置,从而导致事务回滚。当WCF运行时尝试提交事务时,它会失败,因为它已经被中止,然后再次尝试处理相同的消息(因为内置的重试机制)。

当我们修复MSDTC设置时,复制停止。

现在,我们需要弄清楚的是:为什么回滚到服务事务会导致消息成倍增加?

票数 2
EN

Stack Overflow用户

发布于 2013-03-04 14:51:08

除非应用程序删除消息或TimeToBeReceived计时器过期,否则MSMQ不会删除消息。

如果我正确地理解了您的环境,您的问题可能是由于接收到的消息处理时间过长造成的。如果消息的接收和重新发送是在同一个事务中完成的,那么第一个WCF服务可能会在最后从队列中删除消息之前多次尝试读取相同的消息。

这使我想到以下你可以尝试的想法:

  • 在收到原始消息后,您可以尝试创建一个内容相同的新消息,并将新消息发送到下一个WCF服务。这将减少接收到的消息的生存期。
  • 如果您需要保留相同的消息顺序,可以尝试Miker169 169的建议,将您的配置更改为InstanceContextMode.Single , ConcurrencyMode = ConcurrencyMode.Single (https://stackoverflow.com/a/2610093/219344)。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15074568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档