【发布时间】:2013-08-19 03:06:31
【问题描述】:
我在同一个实例上有两个数据库。
一个叫 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)
谁能发现问题?我看不到我在哪里告诉目的地要将消息发送到哪个数据库 - 这可能是问题的一部分?
【问题讨论】:
-
您需要使用安全证书才能将消息从一个数据库发送到另一个数据库 - 看这里:blogs.msdn.com/b/sql_service_broker/archive/2008/08/26/…
标签: sql sql-server service-broker