【问题标题】:My message in target queue is not readable in SQL Server Service Broker我在目标队列中的消息在 SQL Server Service Broker 中不可读
【发布时间】:2019-01-21 13:46:01
【问题描述】:

我正在使用服务代理连接我系统中的其他域,如您在此处看到的,我向目标服务发送消息,如下所示:

_ctx.Database.ExecuteSqlCommand(@"Declare @ConversationHandle uniqueidentifier

Begin Transaction
Begin Dialog @ConversationHandle
 From Service SenderService
 To Service 'ReceiverService'
 On Contract SampleContract
 WITH Encryption=off;
SEND 
      ON CONVERSATION @ConversationHandle
      Message Type SenderMessageType
  ('<Reception>Add</Reception><OrganizationId>2</OrganizationId>') Commit");

另一方面,我让 SP 能够得到这样的消息:

ALTER PROCEDURE [dbo].[usp_ProcessTargetQueue] as
BEGIN
Declare @ConversationHandle as uniqueidentifier
Declare @MessageBody as nvarchar(max)
Declare @MessageType as sysname
declare @MessageBodyXML as xml


    WHILE (1=1)
    BEGIN

        BEGIN TRANSACTION;
        WAITFOR (
           RECEIVE top (1)
      @MessageType = message_type_name,
      @ConversationHandle = conversation_handle,
    @MessageBody = message_body
FROM TargetQueue

        ), TIMEOUT 5000;

       IF (@@ROWCOUNT = 0)
        BEGIN
              ROLLBACK TRANSACTION;
              BREAK;
        END
if @MessageType = 'SenderMessageType'
      BEGIN
            SEND 
                  ON CONVERSATION @ConversationHandle
                  Message Type ReceiverMessageType
                  ('Message is received')
            END Conversation @ConversationHandle

        set @MessageBodyXML=    (select cast(@MessageBody as xml)  )

      insert into s (s1) select CONVERT(nvarchar(max), @MessageBodyXML)

   END


        COMMIT TRANSACTION;




     END  

    END

如您所见,我将 message_body 插入到 s1 表中,但是当我检查表时,我看不到消息。

【问题讨论】:

    标签: sql-server service-broker


    【解决方案1】:

    此代码将一个 varchar 值插入到二进制 message_body 中:

    SEND 
          ON CONVERSATION @ConversationHandle
          Message Type SenderMessageType
      ('<Reception>Add</Reception><OrganizationId>2</OrganizationId>') Commit");
    

    但这段代码将二进制值转换为nvarchar,因此该值被误解:

    insert into s (s1) select CONVERT(nvarchar(max), @MessageBodyXML)
    

    解决此问题的一种方法是指定 N 前缀,以便 xml 字符串是 Unicode 文字:

    SEND 
          ON CONVERSATION @ConversationHandle
          Message Type SenderMessageType
      (N'<Reception>Add</Reception><OrganizationId>2</OrganizationId>') Commit");
    

    【讨论】:

    • 只是为解决方案添加另一个想法,将您的消息放入 XML 类型的变量中,然后在 SEND 语句中使用该变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2012-08-01
    相关资源
    最近更新 更多