【问题标题】:Service Broker with Sql Server 2005 - Messages stuck in queue使用 Sql Server 2005 的 Service Broker - 消息卡在队列中
【发布时间】:2009-07-14 19:14:05
【问题描述】:

我正在配置一个简单的服务代理实现。在本地,我们使用 SQL Server 2008 Express,一切正常。一旦代码在我们的生产服务器(SQL SERVER 2005)上运行,消息就会卡在接收者队列中。以下代码不完整,但说明了队列和服务的基本配置方式:

-- Create message type to validate the content of a message
CREATE MESSAGE TYPE MyMessageType VALIDATION = NONE;

-- Create contract to validate what direction messages can be sent in a conversation.
CREATE CONTRACT MyContract 
(
    MyMessageType SENT BY INITIATOR
) 

-- The receiver queue will process each message using the 'spProcessMessage' stored procedure
CREATE QUEUE [MyReceiverQueue];
ALTER QUEUE [MyReceiverQueue] WITH ACTIVATION 
(
      STATUS = ON,
      MAX_QUEUE_READERS = 1,
      PROCEDURE_NAME = spProcessMessage,
      EXECUTE AS SELF
);

-- The receiver service processes the incoming messages and passes them to the ReceiverQueue.
CREATE SERVICE [MyReceiverService] ON QUEUE [MyReceiverQueue]([MyContract]);

-- Queue and service to send the message from
CREATE QUEUE [MySenderQueue];
CREATE SERVICE [MySenderService] ON QUEUE [MySenderQueue];

安装服务后,会以这种方式触发消息:

-- Send a message to the receiver queue
DECLARE @MessageBody XML
SET @MessageBody = ''; 
DECLARE @Handle UNIQUEIDENTIFIER;
BEGIN DIALOG CONVERSATION @Handle
FROM SERVICE [MySenderService]
TO SERVICE 'MyReceiverQueue'
ON CONTRACT [MyContract]
WITH ENCRYPTION = OFF;
SEND ON CONVERSATION @Handle 
MESSAGE TYPE [MyMessageType](@MessageBody);

所有消息都卡在“MyReceiverQueue”中。如果我手动执行“spProcessMessage”,消息会正常处理。

更多细节:
- sys.transmission_queue 为空
- sys.conversation_endpoints 声明这两个服务都在“CONVERSING”
- 启用代理并将数据库配置为与 SQL 2005 兼容

知道为什么这些消息没有自动处理吗?

非常感谢您的宝贵时间。

--

好的,在玩了一会儿之后,我的 ssbdiagnose 开始工作了。正如 Remus 所说,它位于:C:\Program Files\Microsoft SQL Server\100\Tools\Binn。我以这种方式使其在本地工作:

ssbdiagnose -E -S "JDECUPER\SQLEXPRESS" -d mydb CONFIGURATION FROM SERVICE MySenderService TO SERVICE MyReceiverService ON CONTRACT MyContract

然后,我在我们的生产服务器上试了一下:

ssbdiagnose -XML -U loginID -P pwd -S "machine's IP" -d mydb CONFIGURATION FROM SERVICE MySenderService TO SERVICE MyReceiverService ON CONTRACT MyContract > C:\testBrokerService.xml

第一个错误检测到:

Service Broker GUID is identical to that of database Pandilla on server 200.57.141.193

服务器上的另一个数据库具有与服务代理相同的 GUID。我只需要重新生成 GUID:

ALTER DATABASE [myotherdb] SET NEW_BROKER;

第二个错误用户执行存储过程的权限有关

The EXECUTE AS for the user dbo specified for activation on queue dbo.AlbumGanadoresQueue cannot be impersonated due to an exception

升级这些权限后,一切都开始正常工作了。

非常感谢 Remus 为我指明了正确的方向。我有点长,但我希望细节能帮助其他开发者。

【问题讨论】:

    标签: sql-server-2005 queue service-broker


    【解决方案1】:

    首先阅读我网站上的Troubleshooting Dialogs 指南,然后逐步按照步骤操作,直到找到可能的问题。
    其次,如果您有权访问 SQL 2008 部署,请从中运行 ssbdiagnose 工具。虽然是 SQL 2008 的一部分,但也完全能够诊断 SQL 2005。这是首选方法,再次如果您可以访问 SQL 2k8 部署。

    【讨论】:

    • 嗨莱姆斯!我有点希望您能看到我的问题,因为您的文章帮助我配置了我的服务:) 我查看了您的故障排除页面。表 'sys.transmission_queue' 始终为空,这意味着发送者能够发送消息。关于接收方的确认,我执行了函数“get_transmission_status”,但结果也是空的。我没有安装 Profiler 或 SQL 2k8 部署。是否有另一种实用程序/方法来诊断出了什么问题?谢谢。
    • 2k8? ssbdiagnose 是你的朋友。在 \program files\microsoft sql server\10\binn 我相信。运行 SSBDIAGNOSE -E CONNECT TO -S CONNECT TO -S 。您可以从可以连接到服务器的其他机器远程运行它。
    • 您也可以使用我网站上的联系表格直接给我写信
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多