Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server Service Broker错误处理_Sql Server_Sql Server 2005_Service Broker - Fatal编程技术网

Sql server SQL Server Service Broker错误处理

Sql server SQL Server Service Broker错误处理,sql-server,sql-server-2005,service-broker,Sql Server,Sql Server 2005,Service Broker,我有一个存储过程,它将消息放入SQLServerServiceBroker消息队列。如果出现错误,并且消息没有放在消息队列中,我需要从存储过程返回一条错误消息。我看到的问题是,即使SQL Server Service Broker被禁用(这就是我试图测试将消息放入队列失败的方式),当我运行TSQL代码将消息放入队列时,它也不会返回错误 是否有人知道如何检测将消息放入SQL Server Broker消息队列是否失败?Service Broker不会将消息放入目标队列。而是放在数据库传输队列()中

我有一个存储过程,它将消息放入SQLServerServiceBroker消息队列。如果出现错误,并且消息没有放在消息队列中,我需要从存储过程返回一条错误消息。我看到的问题是,即使SQL Server Service Broker被禁用(这就是我试图测试将消息放入队列失败的方式),当我运行TSQL代码将消息放入队列时,它也不会返回错误


是否有人知道如何检测将消息放入SQL Server Broker消息队列是否失败?

Service Broker不会将消息放入目标队列。而是放在数据库传输队列()中。提交发送后,后台发送器将拾取消息,解决路由问题,并将消息发送到目的地

如果目标恰好位于同一实例中,则在SEND语句本身期间会尝试使用快捷方式传递路径,在该语句中,消息将直接放入目标队列。如果排队失败,则消息将被反弹并放置在正常传递路径中,即放入
sys.trasnmission\u queu
e。卡在
sys.transmission\u queue
中的消息将具有
transmission\u状态
,解释消息无法传递的原因。系统将自动重新尝试这些消息

SEND可以返回错误的唯一时间是消息无法发送时,而不是无法传递时。如果您试图在一个关闭的对话中发送
消息,或者出现一些非代理错误(只读数据库、日志已满、内存不足等),甚至阻止将消息接收到
系统传输队列中,则会出现这种情况

这种即使是本地传递异步且松散耦合的标记行为也是有意为之的,旨在通过在目标队列为本地和目标队列为远程时的相同行为来帮助应用程序

处理ServiceBroker中错误的方法是检查您自己的队列以获得响应。如果目标服务主动拒绝您的消息(即拒绝访问、XML格式错误或违反服务合同),则它将以错误结束对话,您将在自己的队列中收到错误消息。如果您的消息根本无法传递,那么它将留在传输队列中,直到过期,然后会话以错误结束,并且错误消息将再次放入您自己的队列中。消息在用
开始对话
指定的生存期到期后超时

因此,在您禁用代理的情况下,消息仍然被接受,但未被传递。它被放置在传输队列中。一旦在数据库中启用回代理,该消息将被拾取并传递。当交付的可靠性是主要关注点时,这种行为使应用程序编写更加简单。即使目的地不可用(例如,为了维护服务而关机),即使需要数小时、数天甚至数周才能发送消息,应用程序也会发送消息,知道消息将到达目的地。对于同样与传递时间有关的应用程序,它们应该指定会话生存期。系统将尝试在此生存期内传递消息或放弃。如果它放弃,它将通过将错误消息(会话超时错误)排入队列来通知发送方


应用程序也不应等待响应。它们应该
发送
提交
并继续,由事件驱动。当目标发送回响应时,或者当底层基础结构通知错误时,应用程序在其自己的队列中收到一条消息,它应该对该消息作出反应。

Hello Remus。在发送失败的情况下,例如尝试发送格式错误的XML时,传输状态为“Service Broker在此对话中收到错误消息”。ServiceBroker不会传输该消息;它将一直保持,直到应用程序结束对话。有没有办法识别队列中的此类消息?我的自动发件人队列正在将其作为普通邮件处理。@milez请另外提问