Mandare messaggi con JMS tra sistemi eterogenei

Di recente mi sono trovato nella necessità di “far parlare” dei sistemi Windows XP con una serie di MDB (Message Driven Bean) Java residenti su un application server Glassfish. Fortunatamente Glassfish include il bellissimo OpenMQ (Open Message Queue) che a sua volta porta in grembo UMS, ovvero Universal Message System.
UMS, tra le sue tante funzionalità, può agire come broker tra sistemi eterogenei, fornendo una conettività a sistemi JMS non raggiungibili normalmente da tecnologie quali C#, VB, .NET e via dicendo.
Certo sarebbe più facile installare una JRE nei client remoti e sviluppare direttamente un piccolo client che accodi su JMS ma non sempre è possibile, o addirittura permesso, installare una JRE, ragion per cui può capitare di doversi arrangiare. UMS arriva proprio a soddisfare questa necessità, utilizzando una semplice applicazione, residente nel web-container. Uno schema preciso si trova qui. Per l’installazione e configurazione del servizio consiglio la lettura di questa eccellente guida (in inglese).

Supponiamo di avere un banale MDB che sta in ascolto su una coda JMS, ogni volta che arriva un messaggio si scatena una precisa elaborazione. Come prima specificato, un programma in C#, VB o simili su una macchina Windows non avrà modo di accordare un messaggio JMS, esistono soluzioni “esotiche” come JMS Courier di Codemesh, alternativamente si possono realizzare strutture CORBA, ma nel caso di messaggi asincroni, JMS rimane la scelta vincente. Ebbene con UMS ogni client in grado i mandare una richiesta HTTP può accodare un messaggio su una coda JMS, siano essi dei semplici messaggi di testo o anche dei SOAP.

Tralascio il codice del MDB in java e passo direttamente ad un esempio in C#, sviluppato su Mono, in questo caso il messaggio inviato è semplicemente il nome del host che sta chiamando:

using System.Net;
using System.Web;
using System.Text;
using System.IO;
using System;

namespace send_ums_message
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            ASCIIEncoding encoding = new ASCIIEncoding ();
            string postData = Environment.MachineName;
            byte[] data = encoding.GetBytes (postData);

            try {
                // Prepare web request in format (service type, destination queue, destination type)
                // Example "http:__//host:port/UMS_DEPLOYMENT_PATH/query"
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create
("http://$SERVER_IP:8080/imqums/simple?service=send&destination=$QUEUE_NAME&domain=queue");
                myRequest.Method = "POST";
                myRequest.ContentType = "text/plain;charset=UTF-8";
                myRequest.ContentLength = data.Length;

                Stream newStream = myRequest.GetRequestStream ();

                // Send the data.
                newStream.Write (data, 0, data.Length);
                newStream.Close ();

                // Get the reply
                HttpWebResponse webResp = (HttpWebResponse)myRequest.GetResponse ();
                Console.WriteLine (webResp.StatusCode);
                Console.WriteLine (webResp.Server);

                // Now, we read the response (the string), and output it.
                Stream answerStream = webResp.GetResponseStream ();
                StreamReader answerRead = new StreamReader (answerStream);
                // Answer is always empty, OpenMQ does not reply anything else more than "Ok"
                Console.WriteLine (answerRead.ReadToEnd ());
            } catch (Exception e) {
                Console.WriteLine ("Exception " + e);
            }
        }
    }
}

Il “trucco” è presto svelato quindi. Una POST normalissima verso il modulo UMS istanziato sul nostro Glassfish server non farà altro che ricevere la POST via HTTP e inoltrarla alla coda JMS opportuna di nome $QUEUE_NAME.

A questo punto non vi rimane che scrivere un piccolo MDB che magari non faccia altro che scrivere su un database il nome del host e il timestamp della chiamata. Per ulteriori dettagli rimando alla pagina principale di OpenMQ.

Leave a Reply

Your email address will not be published. Required fields are marked *