带有Sql Server 2005的Service Broker - 消息停留在队列中

jde*_*per 4 queue sql-server-2005 service-broker

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

-- 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];
Run Code Online (Sandbox Code Playgroud)

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

-- 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);
Run Code Online (Sandbox Code Playgroud)

所有消息都卡在"MyReceiverQueue"中.如果我手动执行'spProcessMessage',则会正常处理消息.

更多细节:
- sys.transmission_queue为空
- sys.conversation_endpoints指出两个服务都是'CONVERSING'
- 启用Broker并将DB配置为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
Run Code Online (Sandbox Code Playgroud)

然后,我在生产服务器上尝试了它:

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
Run Code Online (Sandbox Code Playgroud)

检测到第一个错误

Service Broker GUID is identical to that of database Pandilla on server 200.57.141.193
Run Code Online (Sandbox Code Playgroud)

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

ALTER DATABASE [myotherdb] SET NEW_BROKER;
Run Code Online (Sandbox Code Playgroud)

第二个错误不得不用做用户的权限来执行存储过程:

The EXECUTE AS for the user dbo specified for activation on queue dbo.AlbumGanadoresQueue cannot be impersonated due to an exception
Run Code Online (Sandbox Code Playgroud)

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

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

Rem*_*anu 8

首先阅读我网站上的" 故障排除对话框"指南,然后按照步骤进行操作,直至找到可能的问题.
其次,如果您有权访问SQL 2008部署,请从中运行ssbdiagnose工具.虽然是SQL 2008的一部分,但完全能够诊断SQL 2005.如果您有权访问SQL 2k8部署,这是首选方法.

  • 2K8?ssbdiagnose是你的朋友.在\ program files\microsoft sql server\10\binn我相信.运行SSBDIAGNOSE -E CONNECT TO -S <firstsqlinstance> CONNECT TO -S <secondinstance>.您可以从可以连接到服务器的其他计算机远程运行它. (2认同)