Publicación de mensajes en MSMQ desde SQL Server

En este artículo se muestra cómo publicar el mensaje en MSMQ desde SQL Server.

Versión original del producto: Cola de mensajes de Microsoft
Número de KB original: 555070

Resumen

La capacidad de interactuar con Microsoft Message Queue Server desde dentro de un procedimiento almacenado SQL Server puede abrir un gran número de posibles soluciones para problemas empresariales comunes. En esta sugerencia se describe una técnica que se puede usar para publicar un mensaje arbitrario en cualquier cola de mensajes accesible.

Hay una interfaz COM que pueden usar las aplicaciones de Visual Basic 6 (y otras) para interactuar con la cola de mensajes. Sin embargo, el método necesario (el método Send de la clase MSMQMessage) no se puede usar desde dentro de SQL Server. La razón de esta limitación es que el método usado para publicar un mensaje en una cola de mensajes acepta un variant como parámetro. Aunque SQL Server permite crear instancias de objetos COM, no permite pasar un tipo de datos variant.

La solución consiste en colocar un contenedor específico del tipo alrededor del método Send. De este modo, SQL Server no puede crear solo el objeto COM, pasando también una cadena (u otro tipo de datos SQL intrínsecos) al objeto, que a su vez envía el mensaje a la cola de mensajes. Los pasos siguientes logran este objetivo.

Creación del contenedor específico del tipo en torno al método Send

  1. Ejecute Visual Studio .NET. Cree un nuevo proyecto de biblioteca de clases.

  2. Cambie el nombre de la clase en el Class1.cs archivo a SqlMsmq.

  3. Agregue un método público llamado 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. Dado que el ensamblado debe colocarse en la caché global de ensamblados, debe tener un nombre seguro.

  5. On the Build menu, click Build Solution.

Colocar el ensamblado compilado en la caché global de ensamblados

  1. Ejecución del símbolo del sistema de Visual Studio .NET
  2. Vaya al directorio en el que se creó el ensamblado SqlMsmq.
  3. Ejecute el comando: gacutil /i sqlmsmq.dll

Registro del ensamblado

Para que la clase implementada en el ensamblado esté disponible a través de una interfaz COM, es necesario colocar información sobre la clase en el Registro. Aunque hay varias maneras de hacerlo, la más fácil usa la herramienta de registro de ensamblados (regasm.exe).

Todavía en el símbolo del sistema de .NET de Visual Studio, ejecute el comando : regasm sqlmsmq.dll.

Creación del procedimiento almacenado

El procedimiento almacenado que usa la SqlMsmq clase utiliza el sp_OACreate y sp_OAMethod los procedimientos almacenados para crear instancias del objeto e invocar el SendMessage método respectivamente. El código de T-SQL siguiente crea este procedimiento almacenado.

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 legal de activación de soluciones de comunidad

MICROSOFT CORPORATION Y/O SUS RESPECTIVOS PROVEEDORES NO HACEN NINGUNA REPRESENTACIÓN SOBRE LA IDONEIDAD, CONFIABILIDAD O PRECISIÓN DE LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS AQUÍ. TODA DICHA INFORMACIÓN Y GRÁFICOS RELACIONADOS SE PROPORCIONAN "TAL CUAL" SIN GARANTÍA DE NINGÚN TIPO. MICROSOFT Y/O SUS RESPECTIVOS PROVEEDORES RENUNCIAN POR LA PRESENTE A TODAS LAS GARANTÍAS Y CONDICIONES CON RESPECTO A ESTA INFORMACIÓN Y A LOS GRÁFICOS RELACIONADOS, INCLUIDAS TODAS LAS GARANTÍAS IMPLÍCITAS Y CONDICIONES DE COMERCIABILIDAD, IDONEIDAD PARA UN PROPÓSITO DETERMINADO, ESFUERZO PROFESIONAL, TÍTULO Y NO INFRACCIÓN. USTED ACEPTA ESPECÍFICAMENTE QUE EN NINGÚN CASO MICROSOFT NI SUS PROVEEDORES SERÁN RESPONSABLES DE LOS DAÑOS DIRECTOS, INDIRECTOS, PUNITIVOS, INCIDENTALES, ESPECIALES, CONSECUENTES NI DE NINGÚN TIPO, INCLUIDOS, SIN LIMITACIÓN, LOS DAÑOS POR PÉRDIDA DE USO, DATOS O BENEFICIOS, DERIVADOS DE O DE CUALQUIER MANERA RELACIONADOS CON EL USO O LA INCAPACIDAD DE UTILIZAR LA INFORMACIÓN Y LOS GRÁFICOS RELACIONADOS CONTENIDOS AQUÍ, YA SEA POR CONTRATO, AGRAVIO, NEGLIGENCIA, RESPONSABILIDAD ESTRICTA O DE OTRO MODO, INCLUSO SI MICROSOFT O CUALQUIERA DE SUS PROVEEDORES HA SIDO INFORMADO DE LA POSIBILIDAD DE DAÑOS.