Nézzük mi is kell a Microsoft Message Queuing (MSMQ) használatához. Először is nem minden operációs rendszerbe kerül feltelepítésre automatikusan ez a szolgáltatás. Ezt persze utólag könnyedén megoldhatjuk, ha a Programok hozzáadása/eltávolítása segédprogramban a Windows összetevőket választva feltelepítjük az MSMQ-t is.
- MSMQ 1.0 verziója a Windows NT 4.0, Windows 95 és Windows 98 operációs rendszerekkel került szállításra.
- MSMQ 2.0 verzióját a Windows 2000 tartalmazza.
- MSMQ 3.0 verziója pedig a Windows XP-vel került piacra.
Az MSMQ telepítés után nem igényel külön konfigurációt, bonyolultabb helyzetekre a Számítógép kezelést elindítva a szervizek között találunk egy Message Queuing beépülő modult, ahol elvégezhetjük a szükséges feladatokat.
Nézzük most a programozási oldalát a Message Queuing szolgáltatásnak.
Hivatkoznunk kell a Messaging névtérre, ehhez azonban hozzá kell adnunk egy új referenciát a System.Messaging.dll-ről a projektünkhöz. (Project – Add Reference menüpont, majd a megjelenő listából keressük elő a System.Messaging.dll-t).
Szükségünk lesz egy sztringre, mely az üzenet kezelési sor elérési útvonalát adja meg. Itt először annak a gépnek a nevét kell megadni, melyen fut az MSMQ szolgáltatás. Ha a saját számítógépünkön fut az MSMQ, akkor egy ponttal is hivatkozhatunk a gép név megadása helyett. Ezután jöhet az üzenet kezelési sor neve, mely a mi példánkban a SoftwareOnline sztring lesz. E két név közé kell megadnunk a Private$ sztringet, abban az esetben, ha a magán üzenet kezelési sort szeretnénk használni.
private string MQPath = ".\\Private$\\SoftwareOnline";
A programunk indulásakor ellenőrizzük, hogy már létezik-e a programunk által használt üzenet kezelési sor. Ha még nem, akkor létrehozzuk.
public Form1()
{
InitializeComponent();
Ellenőrzéshez a MessageQueue osztály Exists függvényét használhatjuk. Paraméterként a kérdéses üzenetkezelési sor elérési útját és nevét kell megadnunk.
if (!MessageQueue.Exists(MQPath))
{
Ha ez a sor még nem létezik, akkor a Create függvénnyel létrehozhatjuk azt. Paraméterként a létrehozandó üzenetkezelési sor elérési útját és nevét kell megadnunk.
MessageQueue.Create(MQPath);
}
}
Így biztosak lehetünk abban, hogy a SoftwareOnline nevű üzenetsor a program indulása után már létezik. Üzenetet küldeni e sorba a következőképpen tudunk:
Szükségünk lesz egy MessageQueue osztályra, melynek konstruktorában megadjuk, hogy melyik üzenetkezelési sorhoz kell kapcsolódnia.
private void button1_Click(object sender, System.EventArgs e)
{
MessageQueue mq = new MessageQueue(MQPath);
Az üzenet tartalmának kezeléséhez létrehozunk egy Message osztályt.
System.Messaging.Message m = new System.Messaging.Message();
Ebbe az egyszerűség kedvéért csupán egy rövid sztringet írunk, mely áll a Message szóból és az aktuális dátum és időpontból. Ezt a szöveget a Message osztály Label property-jében adjuk meg, mintegy címet adva az üzenetünknek.
m.Label = "Message " + DateTime.Now.ToString("G");
A MessageQueue osztály Send függvényét használva, paraméterként megadva neki a Message osztályban tárolt üzenetet, továbbíthatjuk azt a már létrehozott üzenetkezelési sorba.
Az üzenet ezzel bekerül a sorba. Ezt le is ellenőrizhetjük, ha elindítjuk a Számítógép kezelést a vezérlőpulton keresztül és megkeressük a szervizek között a Message Queuing-et, majd itt a Private Queues-en belül a SoftwareOnline sort.
Nézzük most miként tudjuk kiolvasni az ide küldött üzeneteket. Ezt megteheti az a programunk is, mely küldte, bár ennek a gyakorlatban sok értelme nincs. Elindíthatjuk a mellékelt példaprogram egy másik példányát és olvashatjuk azzal is az üzeneteket, persze a valós helyzetekben általában a küldő és a fogadó szoftver különböző. Ez persze a MSMQ-t nem érdekli, sőt nem is befolyásolja működésében, így akár egy alkalmazás is lehet a küldés és fogadó.
Szükségünk lesz ismét egy MessageQueue osztályra, melynek konstruktorában megadjuk, hogy melyik üzenetkezelési sorhoz kell kapcsolódnia.
private void button2_Click(object sender, System.EventArgs e)
{
MessageQueue mq = new MessageQueue(MQPath);
Az üzenet tartalmának kezeléséhez létrehozunk egy Message osztályt.
System.Messaging.Message m = new System.Messaging.Message();
Ezt követően megpróbáljuk kiolvasni a soron következő üzenetet. Ehhez a MessageQueue Receive függvényét használjuk. Ennek paraméterében megadunk egy időintervallumot, melyet most egy másodpercre választunk. Ha ennyi időn belül nem tudjuk kiolvasni az üzenetet, akkor hiba keletkezik és a programunk a catch blokkban folytatódik tovább. Ha a MSMQ szolgáltatás rendben működik, akkor már csak az okozhatja az üzenetünk kiolvashatatlanságát, hogy nincs üzenetünk. Ha a Receive függvényt paraméter nélkül hívnánk meg, akkor programunk futása csak akkor folytatódna, amikor érkezik egy üzenet, melyet azonnal ki is olvasunk. Ebben az esetben viszont célszerű külön szálon elindítani az üzenet lekérdezés kódját, hiszen alkalmazásunk teljesen „lefagy” a Receive hívása miatt, amíg annak nem sikerül üzenetet kiolvasnia. Kiolvasás abban a sorrendben történik, ahogy az üzenetek érkeznek. Tudni kell azt is, hogy a Receive törli a kiolvasott üzenetet.
try
{
m = mq.Receive(new TimeSpan(0, 0, 0, 1, 0));
Ha a Receive függvény befejezte futását, akkor visszatérési értékként adott objektumból kiolvashatjuk az üzenet paramétereit, melyből most számunkra a Label property értéke lesz érdekes.
label1.Text = (string)m.Label;
}
catch (Exception ex)
{
label1.Text = ex.Message;
}
}