首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法向SQLServer2008ServiceBroker发送消息:消息类型'<message type>‘不是服务契约的一部分

无法向SQLServer2008ServiceBroker发送消息:消息类型'<message type>‘不是服务契约的一部分
EN

Stack Overflow用户
提问于 2014-03-28 20:12:05
回答 2查看 1.5K关注 0票数 2

我正在尝试学习Service的基础知识,并创建了一个最初基于SSMS模板的应用程序。但是,我不能向队列发送消息。它只是说消息类型不是服务契约的一部分。

我需要重新创建的绝对最小值是以下批:

代码语言:javascript
运行
复制
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

...which产量:

代码语言:javascript
运行
复制
Msg 8431, Level 16, State 1, Line 10
The message type 'test_message' is not part of the service contract.

我只需要能够在同一个数据库中发送异步消息。没有远程连接需要考虑,而且我甚至不需要严格地处理回复。

我检查了消息类型、契约、队列和服务是否都存在,并且契约的属性表示消息类型包括在内。

我遗漏了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-29 07:45:21

试试这个:

代码语言:javascript
运行
复制
BEGIN DIALOG @dialog_handle
FROM SERVICE test_service
TO SERVICE N'test_service'
ON CONTRACT test_contract;
票数 3
EN

Stack Overflow用户

发布于 2014-03-31 07:18:32

正如丹尼斯已经回答的那样,您错过了ON CONTRACT test_contract

如果省略它,则使用DEFAULT合同。每个数据库都有一个名为DEFAULT的契约,它有一个消息类型,也称为DEFAULT。当您省略BEGIN DIALOG中的任何合同时,使用DEFAULT协议,在SEND中省略消息类型时使用DEFAULT消息类型。

代码语言:javascript
运行
复制
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是区分大小写的。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22722338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档