SQL Service Broker示例不起作用

时间:2013-08-19 03:06:32

标签: sql sql-server service-broker

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

一个名为ICMS,一个名为CarePay_DEV1

当ICMS(来源)发生变更时,需要向CarePay_Dev1(目的地)发送消息。

我是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

我明白了:

  

命令已成功完成。

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

/****** 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)

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

2 个答案:

答案 0 :(得分:2)

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

此外,为了将来的疑难解答,您可能需要使用SSBDiagnose或通过Remus Rusanu's numerous articles阅读主题

答案 1 :(得分:1)

我认为发起人服务向您自己发送了一条消息。尝试更改目标(terget)服务的名称。

相关问题