Descrição do aplicativo do Service Broker

A maioria dos aplicativos do Service Broker adota as mesmas etapas básicas para receber e processar mensagens:

  1. O aplicativo começa uma transação.

  2. Se o aplicativo mantiver o estado, ele obterá um identificador de grupo de conversação. O aplicativo usa esse identificador para restaurar o estado de uma tabela estatal. Se não houver nenhum grupo de conversação com mensagens prontas para serem recebidas, o aplicativo reverterá a transação e será encerrado.

  3. O aplicativo recebe uma ou mais mensagens da fila. Se o aplicativo tiver um identificador de grupo de conversação, esse aplicativo usará o identificador de grupo de conversação para receber mensagens para aquele grupo de conversação. Se mais nenhuma mensagem estiver disponível para ser recebida, o aplicativo confirmará a transação e retornará para a Etapa 1.

  4. O aplicativo valida o conteúdo das mensagens com base no nome do tipo de mensagem.

  5. O aplicativo processa as mensagens com base no nome do tipo de mensagem e no conteúdo da mensagem.

  6. O aplicativo envia qualquer mensagem que resultado do processamento.

  7. Se o aplicativo mantiver o estado, ele atualizará a tabela de estado, usando o identificador do grupo de conversação como a chave principal da tabela.

  8. O aplicativo retorna para a Etapa 3 para verificar se mais mensagens estão disponíveis.

A estrutura exata do aplicativo depende dos requisitos do aplicativo, do estilo de comunicação do aplicativo, se o aplicativo é um serviço de destino ou um serviço inicial e se o Service Broker ativa ou não o aplicativo.

Por exemplo, um aplicativo inicial envia uma mensagem antes de iniciar o loop de processamento descritos nas etapas acima. O serviço inicial pode enviar uma mensagem de outro programa ou procedimento armazenado e, em seguida, use um procedimento armazenado de ativação para a fila de serviço inicial. Por exemplo, um aplicativo de entrada de ordem pode incluir um aplicativo externo que inicia a conversação para inserir o pedido. Depois que o pedido for inserido, o aplicativo externo não precisará permanecer em execução. Um procedimento armazenado de ativação para o serviço inicial envia a confirmação de pedido quando uma resposta retorna do serviço de pedido. O procedimento armazenado de ativação também processa quaisquer mensagens de erro do Service Broker que são retornadas pelo serviço de destino e envia notificações de que não foi possível confirmar o pedido.

Alternativamente, em vez de enviar uma mensagem de um programa diferente, o aplicativo inicial pode enviar uma mensagem e, em seguida, iniciar o loop de processamento como parte do mesmo programa. Independentemente dessas variações, a descrição básica permanece a mesma.

Um aplicativo que processa um grande número de mensagens no mesmo grupo de conversação pode manter uma contagem das mensagens recebidas e confirmar uma transação após o processamento de um determinado número de mensagens. Essa estratégia de contagem e confirmação permite que o aplicativo mantenha transações relativamente curtas e permite que o aplicativo processe diferentes grupos de conversação.

Exemplo

O exemplo do Transact-SQL a seguir processa todas as mensagens no fila MyServiceQueue. O processamento para a mensagem é mínimo. Se a mensagem for um EndDialog ou uma mensagem de erro, o código terminará a conversação. Para qualquer outra mensagem, o código cria uma representação XML da mensagem e gera um conjunto de resultados que contém o identificador da conversação, o nome do tipo de mensagem e o XML. Quando nenhuma mensagem estiver disponível durante 500 milissegundos, o código será encerrado.

Para maior simplicidade, o script gera um conjunto de resultados para cada mensagem. Se um erro ocorrer durante a leitura da fila, o script confirmará as alterações sem gerar resultados. Portanto, esse script removerá silenciosamente qualquer mensagem que gere um erro.

ObservaçãoObservação

Como o script simplesmente exibe mensagens, nenhuma mensagem suspeita será possível para esse script. Portanto, o script não contém código para tratar mensagens suspeitas. Um aplicativo de produção deve ser gravado para tratar mensagens suspeitas. Para obter mais informações sobre mensagens suspeitas, consulte Tratando de mensagens suspeitas.

USE AdventureWorks ;
GO

-- Process all conversation groups.

WHILE (1 = 1)
BEGIN

DECLARE @conversation_handle UNIQUEIDENTIFIER,
        @conversation_group_id UNIQUEIDENTIFIER,
        @message_body XML,
        @message_type_name NVARCHAR(128);


-- Begin a transaction, one per conversation group.

BEGIN TRANSACTION ;

-- Get next conversation group.

WAITFOR(
   GET CONVERSATION GROUP @conversation_group_id FROM MyServiceQueue),
   TIMEOUT 500 ;

-- Restore the state for this conversation group here

-- If there are no more conversation groups, break.

IF @conversation_group_id IS NULL
BEGIN
    ROLLBACK TRANSACTION ;
    BREAK ;
END ;

    -- Process all messages in the conversation group.

    WHILE 1 = 1
    BEGIN

        -- Get the next message.

        RECEIVE
           TOP(1)
           @conversation_handle = conversation_handle,
           @message_type_name = message_type_name,
           @message_body =
           CASE
              WHEN validation = 'X' THEN CAST(message_body AS XML)
              ELSE CAST(N'<none/>' AS XML)
          END
       FROM MyServiceQueue
       WHERE conversation_group_id = @conversation_group_id;

       -- If there is no message, or there is an error
       -- reading from the queue, break.

       IF @@ROWCOUNT = 0 OR @@ERROR <> 0
           BREAK;

       -- Process the message. In this case, the program ends the conversation
       -- for Error and EndDialog messages. For all other messages, the program
       -- produces a result set with information about the message.

       SELECT @conversation_handle,
              @message_type_name,
              @message_body ;

       -- If the message is an end dialog message or an error,
       -- end the conversation. Notice that other conversations
       -- in the same conversation group may still have messages
       -- to process. Therefore, the program does not break after
       -- ending the conversation.

       IF @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
          OR @message_type_name =
              'https://schemas.microsoft.com/SQL/ServiceBroker/Error'
       BEGIN
          END CONVERSATION @conversation_handle ;
       END ;

    END ; -- Process all messages in conversation group.

   COMMIT TRANSACTION ;

END ; -- Process all conversation groups.