Мое сообщение в целевой очереди недоступно для чтения в SQL Server Service Broker - PullRequest
0 голосов
/ 21 января 2019

Я использую Service Broker для подключения других доменов в моей системе, как вы можете видеть здесь, я отправляю сообщение целевой службе следующим образом:

_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, но когда я проверяю таблицу, я не вижу сообщений.enter image description here

1 Ответ

0 голосов
/ 21 января 2019

Этот код вставляет значение 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");
...