SQL Server:在Service Broker中使用Schema Collection验证消息

本文档详细介绍了如何使用SQL Server服务代理创建XML架构集合、消息类型、合约、队列和服务,最后通过对话机制实现消息的发送与接收,并对发送失败的情况进行了分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是我编写的一个手册中的一部分

    --第一步:创建一个XML架构集合
        --假设我们希望的XML数据格式如下(将它保存为OrderRequest.xml
        /*
        
        
            
                
                    
                    
                

            
        */
    
        --使用xsd工具生成架构 >xsd OrderRequst.xml
        
        
        --创建架构集合
        CREATE XML SCHEMA COLLECTION OrderRequestSchema AS
        N'
        
          
            
              
                
                  
                    
                      
                        
                          
                          
                          
                        
                      
                    
                  
                
              
              
              
              
            
          
          
            
              
                
              
            
          
        ';


        --这个Schema中我们定义了数据类型,并且我们规定item必须至少出现一次,也就是说一个订单必须至少有一个明细
        
    
    --第二步:创建一个消息类型,使用该架构集合进行验证
      CREATE MESSAGE TYPE
    [//Adventure-Works.com/OrderRequest]
    VALIDATION = VALID_XML WITH SCHEMA COLLECTION OrderRequestSchema ;
    

    --第三步:创建合约
    CREATE CONTRACT [//AWDB/1DBSample/OrderContract]
      ([//Adventure-Works.com/OrderRequest]
       SENT BY INITIATOR
      );
    GO
    
    
    --第四步:创建队列和服务
    CREATE QUEUE InitOrderQueue
    CREATE QUEUE TargetOrderQueue
    
    CREATE SERVICE InitOrderService
    ON QUEUE InitOrderQueue([//AWDB/1DBSample/OrderContract])
    CREATE SERVICE TargetOrderService
    ON QUEUE TargetOrderQueue([//AWDB/1DBSample/OrderContract])
    --第五步:测试消息传输
    
    DECLARE @InitDlgHandle UNIQUEIDENTIFIER;--这是会话的句柄
    DECLARE @RequestMsg NVARCHAR(100);

    BEGIN TRANSACTION;
        BEGIN DIALOG @InitDlgHandle--BEGIN DIALOG语句会开始一个会话,并将会话的句柄赋予之前的变量
             FROM SERVICE
              InitOrderService  --FROM SERVICE是不要单引号的,直接引用对象。(为什么这样做?)
             TO SERVICE
              N'TargetOrderService' -- TO SERVICE则需要单引号
             ON CONTRACT
              [//AWDB/1DBSample/OrderContract]
             WITH
                 ENCRYPTION = OFF; --不做加密

        SELECT @RequestMsg =
               N'Message for Target service.'; --这里用SET语句应该也是一样的吧

        /*SEND ON CONVERSATION @InitDlgHandle
             MESSAGE TYPE 
             [//AWDB/1DBSample/RequestMessage]
             (@RequestMsg);
        */     
             --如果这里不改,那么会报告一个错误,因为服务不接受这种消息
             /*
消息 8431,级别 16,状态 1,第 18 行
消息类型 '//AWDB/1DBSample/RequestMessage' 不是服务约定的一部分。
             
             */
             
        SEND ON CONVERSATION @InitDlgHandle
            MESSAGE TYPE
            [//Adventure-Works.com/OrderRequest](@RequestMsg)

        SELECT @RequestMsg AS SentRequestMsg;  --显示一下发送出去的消息
        --请注意,我们的消息是不满足架构的,但这个代码执行是没有问题的
        

    COMMIT TRANSACTION;
    GO
    

    
    
    SELECT * FROM InitOrderQueue
    SELECT * FROM TargetOrderQueue
    --通过查看两个队列中的消息,我们发现目标队列中并没有消息,而来源队列中则有一个类型为http://schemas.microsoft.com/SQL/ServiceBroker/Error的消息,什么意思呢?就是说发送失败了.
    
    --下面我们来读取这个消息看看什么内容
    DECLARE @Msg NVARCHAR(1000);
    RECEIVE @Msg=message_body FROM InitOrderQueue;
    SELECT @Msg;
    
    --错误消息是下面这样的,意思就是说验证无法通过。
--
--    
--        -9615
--        A message of type '//Adventure-Works.com/OrderRequest' failed XML validation on the target service.  XML Validation: Declaration not found for element 'RequestMsg'. Location: /*:RequestMsg[1] This occurred in the message with Conversation ID '2CEEFDE9-3E21-416E-B8FB-E731CF8FDA4C', Initiator: 1, and Message sequence number: 0.
--        
--    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值