gpt4 book ai didi

sql-server-2005 - 带有 Sql Server 2005 的服务代理 - 消息卡在队列中

转载 作者:行者123 更新时间:2023-12-04 23:33:58 24 4
gpt4 key购买 nike

我正在配置一个简单的服务代理实现。在本地,我们使用 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”
- 启用 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

然后,我在我们的生产服务器上试了一下:
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 为我指明了正确的方向。我有点长,但我希望细节能帮助其他开发人员。

最佳答案

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

关于sql-server-2005 - 带有 Sql Server 2005 的服务代理 - 消息卡在队列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1127404/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com