我们有一个会谈到第三方Web服务一个卤面消息处理程序。 由于我们无法直接控制的原因,因为它遇到了自己的数据库数据库死锁这个WCF服务经常会抛出异常。 然后画谜将尝试处理此消息五次,在大多数情况下是指那些五次之一将是幸运的,并没有得到一个僵局。 但是频繁地发生的消息确实死锁后,得到的僵局,在我们的错误队列结束。
除了固定的死锁的来源,这将是一个长期的目标,我能想到的两个选项:
保持仅与该特定消息类型尝试,直到成功为止。 最好我将能够设置一个超时,所以“如果有五个死锁然后在5分钟内重试”,而不是不断地尝试更呛的过程了。 我已经做了Thread.Sleep(随机),在一定程度上传播的消息,但它仍然在5次尝试放弃。
发送该特定消息类型,以不同的队列仅具有一个工人处理该消息,以使这种情况发生串联而非并联连接。 我们目前的配置使用8个工作者线程,但这只是使死锁情况更糟,因为web服务现在被同时调用和消息在对方的方式获得。
方案2有我的偏好,但我不知道这是可能的。 我们在接收端配置目前看起来是这样的:
var adapter = new Rebus.Ninject.NinjectContainerAdapter(this.Kernel);
var bus = Rebus.Configuration.Configure.With(adapter)
.Logging(x => x.Log4Net())
.Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
.MessageOwnership(d => d.FromRebusConfigurationSection())
.CreateBus().Start();
而为的.config 接收方 :
<rebus inputQueue="app.msg.input" errorQueue="app.msg.error" workers="8">
<endpoints>
</endpoints>
</rebus>
从我可以从配置来讲,它只能设定一个输入队列“听”到。 我真的不能找到一种方法,通过流畅的地图API来做到这一点无论是。 这似乎只需要一个输入和错误队列,以及:
.Transport(t =>t.UseMsmq("input", "error"))
基本上,我正在寻找的是沿着线的东西:
<rebus workers="8">
<input name="app.msg.input" error="app.msg.error" />
<input name="another.input.queue" error="app.msg.error" />
</rebus>
如何处理我的要求有什么建议?