HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Message Queuing programozása


Message Queue 1. rész

Példaprogram letöltése

6685 bájt

A Message Queuing technológia alkalmazásával lehetőségünk nyílik arra, hogy különböző alkalmazások kommunikáljanak egymással, melyek akár különféle hálózaton keresztül kapcsolódhatnak össze. Az üzenetküldésre úgy is lehetőség van, hogy bizonyos alkalmazások vagy számítógépek nem minden esetben érhetők el bármely időpontban. Az üzenet elküldése után az egy adott helyen tárolásra kerül, amikor újra elérhetővé válik a gép, illetve alkalmazás, akkor az erről a helyről kiolvashatja a számára küldött üzenetet, adatot.

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).
using System.Messaging;
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.
      mq.Send(m);
    }
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;
      }    
    }

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2001 évkönyv 280. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |