Postar mensagem no MSMQ de SQL Server

Este artigo mostra como postar mensagem no MSMQ de SQL Server.

Versão original do produto: Enfileiramento de mensagens da Microsoft
Número original do KB: 555070

Resumo

A capacidade de interagir com a Fila de Mensagens da Microsoft de dentro de um procedimento armazenado SQL Server pode abrir um grande número de soluções possíveis para problemas comerciais comuns. Esta dica descreve uma técnica que pode ser usada para postar uma mensagem arbitrária em qualquer fila de mensagens acessível.

Há uma interface COM que pode ser usada por aplicativos do Visual Basic 6 (e outros) para interagir com a fila de mensagens. No entanto, o método necessário (o método Enviar da classe MSMQMessage) não pode ser usado de dentro de SQL Server. O motivo dessa limitação é que o método usado para postar uma mensagem em uma fila de mensagens aceita uma Variant como parâmetro. Embora SQL Server permita que objetos COM sejam instanciados, ele não permite que um tipo de dados variant seja passado.

A solução é colocar um wrapper específico do tipo em torno do método Enviar. Dessa forma, SQL Server não pode apenas criar o objeto COM, passando também uma cadeia de caracteres (ou outro tipo de dados SQL intrínseco) para o objeto, que em transforma a mensagem na fila de mensagens. As etapas a seguir atingem essa meta.

Criar o wrapper específico do tipo em torno do método Enviar

  1. Execute o Visual Studio .NET. Crie um novo projeto da Biblioteca de Classes.

  2. Altere o nome da classe no Class1.cs arquivo para SqlMsmq.

  3. Adicione um método público chamado SendMessage a Class1.cs.

    publicvoid SendMessage(string queuePath, string messageLabel, string messageBody)
    {
        if (MessageQueue.Exists(queuePath))
        {
            MessageQueue mq = new MessageQueue(queuePath);
            Message mm = new Message();
            mm.Label = messageLabel;
            mm.Body = messageBody;
            mq.Send(mm);
            mq.Close();
        }
    }
    
  4. Como o assembly deve ser colocado no Cache do Assembly Global, ele deve ser fortemente nomeado.

  5. On the Build menu, click Build Solution.

Colocar o assembly compilado no Cache do Assembly Global

  1. Executar o Prompt de Comando .NET do Visual Studio
  2. Navegue até o diretório no qual o assembly sqlMsmq foi criado.
  3. Execute o comando: gacutil /i sqlmsmq.dll

Registrar o assembly

Para tornar a classe implementada no assembly disponível para por meio de uma interface COM, as informações sobre a classe precisam ser colocadas no registro. Embora haja várias maneiras de fazer isso, o mais fácil usa a Ferramenta de Registro do Assembly (regasm.exe).

Ainda no Prompt de Comando .NET do Visual Studio, execute o comando: regasm sqlmsmq.dll.

Criar o Procedimento Armazenado

O procedimento armazenado que usa a SqlMsmq classe utiliza os procedimentos sp_OACreate e sp_OAMethod armazenados para instanciar o objeto e invocar o SendMessage método, respectivamente. O código T-SQL abaixo cria um procedimento armazenado.

CREATE PROCEDURE prcSendMSMQMessage
 @msmqPath varchar(255),
 @messageLabel varchar(255),
 @messageBody varchar(1000)

AS

DECLARE @msmqQueue INT
DECLARE @result INT

-- Create the SQLMSMQ Object.
EXECUTE @result = sp_OACreate 'SqlMsmq', @msmqQueue OUT, 1
IF @result <> 0 GOTO ErrorHandler

-- Send the message using the Send method
EXECUTE @result = sp_OAMethod @msmqQueue, 'SendMessage', NULL, @msmqPath, @messageLabel, @messageBody
IF @result <> 0 GOTO ErrorHandler

GOTO DestroyObjects

ErrorHandler:

DECLARE @source varchar(53)
DECLARE @description VARCHAR(200)
EXECUTE sp_OAGetErrorInfo @msmqQueue, @source OUT, @description OUT, NULL, NULL
RAISERROR(@description, 16, 1)

GOTO DestroyObjects

DestroyObjects:
-- Destroy the SQLMSMQ object.
EXECUTE @result = sp_OADestroy @msmqQueue

RETURN

The following T-SQL code provides an example of how to invoke this stored procedure:

EXEC prcSendMSMQMessage 'queue_path', 'message_label', 'message_body'

Aviso de isenção de responsabilidade por conteúdo de soluções da comunidade

A MICROSOFT CORPORATION E/OU SEUS RESPECTIVOS FORNECEDORES NÃO FAZEM REPRESENTAÇÕES SOBRE A ADEQUAÇÃO, CONFIABILIDADE OU PRECISÃO DAS INFORMAÇÕES E DOS GRÁFICOS RELACIONADOS CONTIDOS AQUI. TODAS ESSAS INFORMAÇÕES E ELEMENTOS GRÁFICOS RELACIONADOS SÃO FORNECIDOS "COMO ESTÁ" SEM GARANTIA DE QUALQUER TIPO. A MICROSOFT E/OU SEUS RESPECTIVOS FORNECEDORES SE ISENTAM DE TODAS AS GARANTIAS E CONDIÇÕES EM RELAÇÃO A ESSAS INFORMAÇÕES E GRÁFICOS RELACIONADOS, INCLUINDO TODAS AS GARANTIAS IMPLÍCITAS E CONDIÇÕES DE COMERCIALIZAÇÃO, APTIDÃO PARA UMA FINALIDADE ESPECÍFICA, ESFORÇO WORKMANLIKE, TÍTULO E NÃO VIOLAÇÃO. VOCÊ CONCORDA ESPECIFICAMENTE QUE EM NENHUM EVENTO A MICROSOFT E/OU SEUS FORNECEDORES SERÃO RESPONSÁVEIS POR QUAISQUER DANOS DIRETOS, INDIRETOS, PUNITIVOS, INCIDENTAIS, ESPECIAIS, CONSEQÜENTES OU QUAISQUER DANOS, INCLUINDO, SEM LIMITAÇÃO, DANOS POR PERDA DE USO, DADOS OU LUCROS, PROVENIENTES OU DE QUALQUER FORMA CONECTADOS COM O USO OU INCAPACIDADE DE USAR AS INFORMAÇÕES E OS GRÁFICOS RELACIONADOS CONTIDOS AQUI, SEJA COM BASE EM CONTRATO, DELITO, NEGLIGÊNCIA, RESPONSABILIDADE ESTRITA OU NÃO, MESMO QUE A MICROSOFT OU QUALQUER UM DE SEUS FORNECEDORES TENHA SIDO AVISADO DA POSSIBILIDADE DE DANOS.