我有一个场景,我正在使用外部通知来处理从整个海军舰队发送的文件,通常我没有问题,但就在几天前,管理员更改了密码,我的队列处理失败了,我使用这个 C# 代码回滚了事务:
捕获(异常){ TransporterService.WriteEventToWindowsLog(AppName,“回滚事务:”,错误); broker.Tran.Rollback(); 中断; }
此后,我的目标队列将继续填满,但外部激活队列将一无所获。事务回滚后,事件通知是否会被禁用?在捕获异常时,我应该在此处执行 broker.EndDialog 吗?
另外,我的事件通知被禁用后(如果确实发生了这种情况),我该如何重新启用它?我必须删除它并重新创建它吗?提前感谢任何帮助,我喜欢 Service Broker,它的工作非常棒,除了这个我希望尽快修复的错误。
答案1
您的 Service Broker 队列很可能由于以下原因而被禁用:毒药消息检测(这是因为您的 catch 块连续执行了 5 次)。修复了潜在问题(密码错误)后,您只需重新启用队列:
ALTER QUEUE [name] WITH STATUS = ON;
我认为事件通知本身不需要做任何事情。
如果您想在将来快速检测到此类情况,您可以为 QUEUE_DISABLED 事件设置事件通知,以便在队列被禁用时通知您。