接收时Service Broker队列回滚

时间:2017-08-15 11:24:09

标签: sql-server service-broker

使用基于here

的基础
  

Service Broker提供自动毒害消息检测。如果从队列接收消息的事务回滚五次,则自动中毒消息检测会将队列状态设置为OFF。此功能可以防止应用程序无法以编程方式检测到的灾难性故障。

我有一个Windows服务应用程序,它轮询SB队列并将它们发送到Web服务端点。因为,我应该处理任何"服务器下线"问题──将消息留回队列,所以我包括" 队列项接收"和" 队列项目发送"方法进入同一个事务。在第一个异常(HttpRequestException)上,我开始ping服务器以获得预定义的超时,然后继续/关闭程序。

但是,回滚五次是个问题,我知道无论5次连续回滚之间的时间间隔如何,它总是会全局增加回滚次数,因此队列最终会被禁用。我对吗?队列是否有超时归零回滚计数?

如果这是行为,最好排除"队列项目发送"来自交易的方法? 如果我这样做,我应该遵循以下方法:在异常时将消息保存在稍后发送的另一个资源(表,文件)中,或者其他替代方案。

using tables as queues如何保持我的交易统一并从SB的回滚问题中解脱出来?它会像SB一样可靠吗?

1 个答案:

答案 0 :(得分:1)

AFAIK,在POISON_MESSAGE_HANDLING = ON的队列中连续5次回滚同一条消息,无论时间间隔如何,都将禁用队列。

您是否考虑过关闭队列的毒药邮件处理?然后,您的应用程序将负责区分真正的有害消息(永远无法成功处理的消息)与外部服务依赖性的问题。在第一种情况下,您可以将问题消息记录在其他位置并提交而不是回滚。

还可以使用其他模式,例如重新排队消息和提交,但很大程度上取决于是否必须按顺序处理消息。