Search code examples
sql-serverasynchronousstored-proceduresservice-broker

Service broker with activation procedure error


I create a target queue to receive message in sql server using service broker .My target queue is like this :

USE [DatabaseB]
GO

ALTER QUEUE [dbo].[TargetQueue] WITH STATUS = OFF , RETENTION = OFF , ACTIVATION (  STATUS = ON , PROCEDURE_NAME = [dbo].[myp] , MAX_QUEUE_READERS = 10 , EXECUTE AS N'dbo'  ), POISON_MESSAGE_HANDLING (STATUS = ON)

Here is my store procedure that i call when the message is received in target_queue

ALTER PROCEDURE [dbo].[myp]

AS   


WHILE (1=1)
  BEGIN

  Declare @ConversationHandle as uniqueidentifier
Declare @MessageBody as nvarchar(max)
Declare @MessageType as sysname

Begin Transaction
Print 'Started Receiving ';

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

if @MessageType = 'SenderMessageType'
      Begin
            SEND 
                  ON CONVERSATION @ConversationHandle
                  Message Type ReceiverMessageType
                  ('Message is received')
            END Conversation @ConversationHandle
            insert into table_1 (dataa)  values ('salam')
      END

Commit


  end

But when the message is received by the queue my store procedure adds unlimited data to table_1 but i have a condition as you can see above ,i mean for each message that is received the sp should add one row to table not unlimited rows .Why?


Solution

  • I just change the store procedure to this :

    ALTER PROCEDURE [dbo].[myp]
    
    AS   
    
    
    WHILE (1=1)
      BEGIN
    
      Declare @ConversationHandle as uniqueidentifier
    Declare @MessageBody as nvarchar(max)
    Declare @MessageType as sysname
    
    Begin Transaction
    Print 'Started Receiving ';
     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
                insert into table_12 (dataa)  values ('salam')
          END
    
    Commit
    
    
      end