【问题标题】:SQL Service Broker example not workingSQL Service Broker 示例不起作用
【发布时间】: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)

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

【问题讨论】:

标签: sql sql-server service-broker


【解决方案1】:

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

此外,对于未来的故障排除,您可能需要使用SSBDiagnose 或阅读有关该主题的Remus Rusanu's numerous articles

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 谢谢。将源数据库上的所有服务/合同/队列重命名为名称中包含“tx”,并将目标上的所有服务/合同/队列重命名为 Rx。尽管如此,两个队列中似乎都没有出现任何内容。
    • initiator db (SELECT * FROM sys.transmission_queue) 中有什么内容?
    • 啊,里面有行! to_service_name = CarePayRxService,to_broker_instance 是 blnak,from_service_name = CarePayTxService,Service_contract_name = IcmsCarePayTxContract,message_type_name = IcmsCarePayMessage 和 transmission_status = 空白。空白令人担忧?
    • 不,这很正常,因为您没有将 PATH 与代理实例一起使用。确保启用接收队列。 (ALTER QUEUE [youTargetQueue] WITH status = ON;)
    • 这并没有什么不同。让我感到困惑的是,我的源数据库和目标数据库之间似乎没有任何联系。没有我在哪里说消息应该去哪个数据库。我没有遗漏什么吗?
    猜你喜欢
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多