【问题标题】:Cannot send message to SQL Server 2008 Service Broker: The message type '<message type>' is not part of the service contract无法向 SQL Server 2008 Service Broker 发送消息:消息类型“<消息类型>”不是服务合同的一部分
【发布时间】:2014-03-28 20:12:05
【问题描述】:

我正在尝试学习 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.

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

我已经检查并再次检查了消息类型、合同、队列和服务都存在,并且合同的属性表明消息类型包含

我错过了什么?

【问题讨论】:

    标签: sql sql-server-2008 service-broker


    【解决方案1】:

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

    如果您省略它,则使用DEFAULT 合约。每个数据库都有一个名为DEFAULT 的合约,它有一个消息类型,也称为DEFAULT。当你在BEGIN DIALOG 中省略任何合约时使用DEFAULT 合约,当你在SEND 中省略消息类型时使用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 消息类型绑定到发起者和目标(两者都可以在此合约中发送消息,即SENT BY ANY)。合同和消息类型名称始终区分大小写,与数据库排序规则无关,因此名称 DEFAULT 区分大小写。

    【讨论】:

      【解决方案2】:

      试试这个:

      BEGIN DIALOG @dialog_handle
      FROM SERVICE test_service
      TO SERVICE N'test_service'
      ON CONTRACT test_contract;
      

      【讨论】:

      • 谢谢@DenisValeev——我喜欢它的简单!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-31
      • 2013-10-22
      • 1970-01-01
      • 2017-01-20
      • 2012-06-03
      相关资源
      最近更新 更多