Publication d’un message sur MSMQ à partir de SQL Server

Cet article explique comment publier un message sur MSMQ à partir de SQL Server.

Version d’origine du produit : Microsoft Message Queuing
Numéro de la base de connaissances d’origine : 555070

Résumé

La possibilité d’interagir avec Microsoft Message Queuing à partir d’une procédure stockée SQL Server peut ouvrir un grand nombre de solutions possibles aux problèmes courants de l’entreprise. Ce conseil décrit une technique qui peut être utilisée pour publier un message arbitraire dans n’importe quelle file d’attente de messages accessible.

Il existe une interface COM qui peut être utilisée par les applications Visual Basic 6 (et d’autres) pour interagir avec la file d’attente des messages. Toutefois, la méthode nécessaire (la méthode Send de la classe MSMQMessage) ne peut pas être utilisée à partir de SQL Server. La raison de cette limitation est que la méthode utilisée pour publier un message dans une file d’attente de messages accepte un Variant en tant que paramètre. Bien que SQL Server autorise l’instanciation des objets COM, elle n’autorise pas la transmission d’un type de données variant.

La solution consiste à placer un wrapper spécifique au type autour de la méthode Send. De cette façon, SQL Server ne peut pas uniquement créer l’objet COM, en transmettant également une chaîne (ou un autre type de données SQL intrinsèque) à l’objet, qui à son tour publie le message dans la file d’attente des messages. Les étapes suivantes permettent d’atteindre cet objectif.

Créer le wrapper spécifique au type autour de la méthode Send

  1. Exécutez Visual Studio .NET. Créez un projet bibliothèque de classes.

  2. Remplacez le nom de la classe dans le Class1.cs fichier par SqlMsmq.

  3. Ajoutez une méthode publique appelée SendMessage à 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. Étant donné que l’assembly doit être placé dans le Global Assembly Cache, il doit être fortement nommé.

  5. Dans le menu Générer, cliquez sur Générer la solution.

Placer l’assembly compilé dans le Global Assembly Cache

  1. Exécuter l’invite de commandes Visual Studio .NET
  2. Accédez au répertoire dans lequel l’assembly SqlMsmq a été créé.
  3. Exécutez la commande : gacutil /i sqlmsmq.dll

Inscrire l’assembly

Pour rendre la classe implémentée dans l’assembly accessible via une interface COM, les informations relatives à la classe doivent être placées dans le Registre. Bien qu’il existe plusieurs façons de procéder, le plus simple utilise l’outil d’inscription d’assembly (regasm.exe).

Toujours dans l’invite de commandes Visual Studio .NET, exécutez la commande : regasm sqlmsmq.dll.

Créer la procédure stockée

La procédure stockée qui utilise la SqlMsmq classe utilise les procédures sp_OACreate et sp_OAMethod stockées pour instancier l’objet et appeler la SendMessage méthode respectivement. Le code T-SQL ci-dessous crée une procédure stockée de ce type.

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'

Exclusion de contenu communautaire Solutions

MICROSOFT CORPORATION ET/OU SES FOURNISSEURS RESPECTIFS NE FONT AUCUNE DÉCLARATION CONCERNANT LA PERTINENCE, LA FIABILITÉ OU L’EXACTITUDE DES INFORMATIONS ET DES GRAPHIQUES ASSOCIÉS CONTENUS DANS LES PRÉSENTES. TOUTES CES INFORMATIONS ET GRAPHIQUES ASSOCIÉS SONT FOURNIS « TELS QUELS » SANS GARANTIE D’AUCUNE SORTE. MICROSOFT ET/OU SES FOURNISSEURS RESPECTIFS DÉCLINENT PAR LES PRÉSENTES TOUTES LES GARANTIES ET CONDITIONS RELATIVES À CES INFORMATIONS ET GRAPHIQUES ASSOCIÉS, Y COMPRIS TOUTES LES GARANTIES ET CONDITIONS IMPLICITES DE QUALITÉ MARCHANDE, D’ADÉQUATION À UN USAGE PARTICULIER, D’EFFORT MANAGÉ, DE TITRE ET D’ABSENCE DE CONTREFAÇON. VOUS ACCEPTEZ SPÉCIFIQUEMENT QUE MICROSOFT ET/OU SES FOURNISSEURS NE SOIENT EN AUCUN CAS RESPONSABLES DE TOUT DOMMAGE DIRECT, INDIRECT, PUNITIF, ACCESSOIRE, SPÉCIAL, CONSÉCUTIF OU DE TOUT DOMMAGE, Y COMPRIS, SANS LIMITATION, LES DOMMAGES POUR PERTE D’UTILISATION, DE DONNÉES OU DE BÉNÉFICES, DÉCOULANT DE OU DE QUELQUE MANIÈRE QUE CE SOIT LIÉ À L’UTILISATION OU À L’INCAPACITÉ D’UTILISER LES INFORMATIONS ET LES GRAPHIQUES ASSOCIÉS CONTENUS DANS LES PRÉSENTES, QU’ELLE SOIT FONDÉE SUR UN CONTRAT, UN DÉLIT, UNE NÉGLIGENCE, UNE RESPONSABILITÉ STRICTE OU AUTRE, MÊME SI MICROSOFT OU L’UN DE SES FOURNISSEURS A ÉTÉ INFORMÉ DE LA POSSIBILITÉ DE DOMMAGES-INTÉRÊTS.