SQL Service Broker 示例不工作

标签 sql sql-server service-broker

我在同一个实例上有两个数据库。

一个叫 ICMS,一个叫 CarePay_DEV1

当 ICMS (Source) 发生变化时,它需要向 CarePay_Dev1 (Destination) 发送消息。

我是 Broker Services 的新手,正在尝试将消息发送到队列中。一旦成功,我希望将数据放入目标中的表中,然后由 .Net 代码处理。但我只想让某些东西首先出现在目的地。

因此,第 1 步:我在两个数据库上启用服务

-- Enable Broker on CarePay
ALTER DATABASE CarePay_Dev1
SET ENABLE_BROKER; 

-- Enable Broker on Source
ALTER DATABASE ICMS_TRN
SET ENABLE_BROKER;

第 2 步:在源和目标上创建消息类型。

-- Create Message Type on Receiver:
USE CarePay_DEV1
GO
CREATE MESSAGE TYPE [IcmsCarePayMessage]
VALIDATION=WELL_FORMED_XML;

-- Create Message Type on Sender:
USE ICMS_TRN
GO
CREATE MESSAGE TYPE [IcmsCarePayMessage]
VALIDATION=WELL_FORMED_XML;

然后我在两个数据库上创建联系人:

-- Create Message Type on Receiver:
USE CarePay_DEV1
GO
CREATE MESSAGE TYPE [IcmsCarePayMessage]
VALIDATION=WELL_FORMED_XML;

-- Create Message Type on Sender:
USE ICMS_TRN
GO
CREATE MESSAGE TYPE [IcmsCarePayMessage]
VALIDATION=WELL_FORMED_XML;

然后我在两个数据库上创建消息队列:

-- CREATE Sending Messagw Queue
USE ICMS_TRN
GO
CREATE QUEUE CarePayQueue


-- CREATE Receiving Messagw Queue
USE CarePay_Dev1
GO
CREATE QUEUE CarePayQueue

最后,我在两个数据库上创建服务:

-- Create the message services
USE ICMS_TRN
GO
CREATE SERVICE [CarePayService]
ON QUEUE CarePayQueue


USE CarePay_DEV1
GO
CREATE SERVICE [CarePayService]
ON QUEUE CarePayQueue 

现在,队列应该准备好了,所以我尝试将一些东西从源发送到目的地:

-- SEND THE MESSAGE!
USE ICMS_TRN
GO

DECLARE @InitDlgHandle UNIQUEIDENTIFIER
DECLARE @RequestMessage VARCHAR(1000) 

BEGIN TRAN

    BEGIN DIALOG @InitDlgHandle
    FROM SERVICE [CarePayService]
    TO SERVICE 'CarePayService'
    ON CONTRACT [IcmsCarePayContract]

    SELECT @RequestMessage = N'<Message>The eagle has landed!</Message>';

    SEND ON CONVERSATION @InitDlgHandle
    MESSAGE TYPE [IcmsCarePayMessage] (@RequestMessage)

COMMIT TRAN

我得到:

Command(s) completed successfully.

但是当我尝试从目标队列中选择时,它是空的。

/****** Script for SelectTopNRows command from SSMS  ******/
SELECT TOP 1000 *, casted_message_body = 
CASE message_type_name WHEN 'X' 
  THEN CAST(message_body AS NVARCHAR(MAX)) 
  ELSE message_body 
END 
FROM [CarePay_DEV1].[dbo].[CarePayQueue] WITH(NOLOCK)

有人能发现问题吗?我看不到我在哪里告诉目标将消息发送到哪个数据库 - 这可能是问题的一部分?

最佳答案

我强烈建议您阅读 Adam Machanic 的 Service Broker Advanced Basics Workbench ,特别是标题为“路由和跨数据库消息传递”的部分。

此外,为了将来的故障排除,您可能需要使用 SSBDiagnose或者通读 Remus Rusanu's numerous articles关于主题

关于SQL Service Broker 示例不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18305863/

相关文章:

sql - 将数据从 txt 文件导入 IBM netezza SQL 数据库时出错

sql-server - 在哪里可以找到 SQL Server 2014 Service Broker 外部激活器?

sql-server - 我可以在所有数据库上打开服务代理吗?

sql - 如何获取关联的关联id为给定值的记录

sql - concatrelated vba excel的使用

sql - 转换 SQL 日期时间格式

sql-server - 使用 SQL Server 2008 更改跟踪同步框架

mysql - 根据Microsoft SQL Server中其他表中的行的位置排列一个表的列

sql - 在相同的 sqlconnection 但不同的 sql 命令上启动两个 SqlDependency

mysql - 使用 if 条件进行 FIND 和 REPLACE 的 SQL 查询