sql - 无法将消息发送到 SQL Server 2008 Service Broker : The message type '<message type>' is not part of the service contract

标签 sql sql-server-2008 service-broker

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

我需要重新创建的绝对最低限度是以下批处理:

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.

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

我已经检查并仔细检查了消息类型、契约(Contract)、队列和服务是否都存在,并且契约(Contract)的属性表明消息类型包含在内

我错过了什么?

最佳答案

正如 Denis 已经回答的那样,您缺少 ON CONTRACT test_contract

如果省略它,则使用 DEFAULT 协定。每个数据库都有一个名为 DEFAULT 的契约(Contract),它有一种消息类型,也称为 DEFAULT。当您在 BEGIN DIALOG 中省略任何契约(Contract)时,将使用 DEFAULT 契约(Contract),当您在 中省略消息类型时,将使用 DEFAULT 消息类型>发送:

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 消息类型绑定(bind)到发起者和目标(两者都可以在此合约中发送消息,即。SENT BY ANY) .契约(Contract)和消息类型名称始终区分大小写,与数据库整理无关,因此名称 DEFAULT 区分大小写。

关于sql - 无法将消息发送到 SQL Server 2008 Service Broker : The message type '<message type>' is not part of the service contract,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722338/

相关文章:

sql - postgresql 不返回特定数字标准的值

php - odbc_execute 在准备好的语句上失败,然后说它 "failed to fetch error message"

service-broker - Service Broker 应用程序队列禁用事件

sql-server - 服务代理 - 跨数据库选择插入本地数据库?

c# - 使用 SQL Service Broker 将服务与数据库解耦?

python - 使用 Python/pyodbc 插入 Access DB

python - 将一个不相关的行附加到 MySQL 查询

php - 如何通过关键词进行搜索? (PHP)

sql - 查询在SQL Server 2008中返回多个错误

sql-server-2008 - SQL Server 兼容级别含义