我正在尝试学习Service Broker的基础知识,并创建了一个最初基于SSMS模板的应用程序。但是我无法向队列发送消息。它只是说消息类型不是服务合同的一部分。
我需要重新创建的绝对最低要求是以下批次:
USE [test_db]
GO
CREATE MESSAGE TYPE [test_message]
AUTHORIZATION [dbo]
VALIDATION = WELL_FORMED_XML
GO
CREATE CONTRACT [test_contract]
AUTHORIZATION [dbo] (
[test_message] SENT BY ANY
)
GO
CREATE QUEUE [dbo].[test_queue]
WITH STATUS = ON
,RETENTION = OFF
--,ACTIVATION (
-- STATUS = ON
-- ,PROCEDURE_NAME = [dbo].[test_activator]
-- ,MAX_QUEUE_READERS = 1
-- ,EXECUTE AS N'dbo'
--)
ON [PRIMARY]
GO
CREATE SERVICE [test_service]
AUTHORIZATION [dbo]
ON QUEUE [dbo].[test_queue] (
[test_contract]
)
GO
BEGIN TRANSACTION
DECLARE @dialog_handle UNIQUEIDENTIFIER
BEGIN DIALOG @dialog_handle
FROM SERVICE test_service
TO SERVICE N'test_service';
SEND ON CONVERSATION @dialog_handle
MESSAGE TYPE test_message (N'<test />');
END CONVERSATION @dialog_handle;
COMMIT TRANSACTION
GO
......产生:
Msg 8431, Level 16, State 1, Line 10
The message type 'test_message' is not part of the service contract.
我只需要能够在同一个数据库中发送异步消息。没有可以考虑的远程连接,我甚至不需要处理回复。
我已检查并仔细检查消息类型,合同,队列和服务是否全部存在,合同属性是否包含消息类型
我错过了什么?
答案 0 :(得分:3)
丹尼斯已经回答,你错过了ON CONTRACT test_contract
。
如果省略它,则使用DEFAULT
合同。每个数据库都有一个名为DEFAULT
的合同,该合同有一种消息类型,也称为DEFAULT
。当您在DEFAULT
中省略任何合同时使用BEGIN DIALOG
合约,并且当您在DEFAULT
中省略消息类型时使用SEND
消息类型:
BEGIN DIALOG @dialog_handle
FROM SERVICE test_service
TO SERVICE N'test_service'; <-- will use the DEFAULT contract
SEND ON CONVERSATION @dialog_handle
(N'<test />'); <-- will use the DEFAULT message type
DEFAULT
邮件类型没有验证。 DEFAULT
合同将DEFAULT
消息类型绑定到发起者和目标(两者都可以在此合同中发送消息,即SENT BY ANY
)。合同和消息类型名称始终区分大小写,与数据库排序规则无关,因此名称DEFAULT
区分大小写。
答案 1 :(得分:2)
试试这个:
BEGIN DIALOG @dialog_handle
FROM SERVICE test_service
TO SERVICE N'test_service'
ON CONTRACT test_contract;