C# - Message Queue további lehetőségei

Message Queue 2. rész

forráskód letöltése
Az üzenetküldő szolgáltatás mostani cikkében annak további lehetőségeit vesszük szemügyre.
A Message Queue szolgáltatáshoz most is létrehozunk egy privát fiókot, melynek címét egy sztring változóban tároljuk:
    private string MQPath = ".\\Private$\\SoftwareOnline";
A Form1 konstruktorában ellenőrizzük az Exists függvénnyel, hogy létezik-e már ez a fiók, vagy sem. Ha még nem lett létrehozva, akkor a Create függvénnyel létrehozzuk azt.
    public Form1()
    {
      InitializeComponent();
      if (!MessageQueue.Exists(MQPath))
      {
        MessageQueue.Create(MQPath);
      }    
    }
Üzenet küldése ugyanúgy megy, mint sorozatunk első részében.
    private void button1_Click(object sender, System.EventArgs e)
    {
      MessageQueue mq = new MessageQueue(MQPath);
      System.Messaging.Message m = new System.Messaging.Message();
      m.Label = "Message label";
Egyetlen eltérés az akkorihoz képest, hogy most szabályozzuk az üzenet prioritását a Priority property-n keresztül. Ez a MessagePriority felsorolt típus elemei közül kaphat értéket. Alapértelmezési értéke a Normal. A lehetséges értékek:
  • VeryHigh
  • High
  • Highest
  • AboveNormal
  • Normal
  • Lowest
  • Low
  • VeryLow
      m.Priority = MessagePriority.High;
      mq.Send(m);
    }
Az esetleges üzenetek kiolvasását is hasonló módon végezzük.
    private void button2_Click(object sender, System.EventArgs e)
    {
      MessageQueue mq = new MessageQueue(MQPath);
Mivel most az üzenetnek nem csak a legalapvetőbb tulajdonságait szeretnénk megjeleníteni, így a MessageReadPropertyFilter property-nél be kell kapcsolnunk az összes lehetőség elérését. Ezt a SetAll függvényének hívásával meg is tehetjük egy lépésben. Ha ezt kihagynánk, akkor bizonyos tulajdonságok olvasásánál hibaüzenetet kapnánk.
      mq.MessageReadPropertyFilter.SetAll();
      System.Messaging.Message m = new System.Messaging.Message();
      listBox1.Items.Clear();
      try
      {
        m = mq.Receive(new TimeSpan(0, 0, 0, 1, 0));      
A kiolvasott üzenet megjelenítéséhez készítünk egy ShowInfo belső függvényt, mely paraméterként kapja a Message objektumot.
        ShowInfo(m);
      }
      catch (Exception ex)
      {
        listBox1.Items.Add(ex.Message);
      }    
    }
A ShowInfo függvény jeleníti meg tehát egy-egy üzenet tulajdonságát a Form-on lévő ListBox-ba.
    private void ShowInfo(System.Messaging.Message m)
    {
Az üzenet címkéje a már ismert Label property-ből származik.
      listBox1.Items.Add((string)m.Label);        
Az üzenet érkezésének időpontja az ArrivedTime property-ből olvasható ki.
      listBox1.Items.Add("ArrivedTime: " + m.ArrivedTime.ToString("G"));
Az üzenet elküldésének időpontja a SentTime property-ből olvasható ki.
      listBox1.Items.Add("SentTime: " + m.SentTime.ToString("G"));
Minden üzenet rendelkezik egy egyedi azonosítóval, melyet az Id property tárol.
      listBox1.Items.Add("Id: " + m.Id);
Az üzenet küldésekor beállított prioritást a Priority property adja vissza, a már ismert MessagePriority felsorolt típus elemeiből.
      listBox1.Items.Add("Priority: " + m.Priority.ToString());
A küldő verziószámát a SenderVersion property adja meg.
      listBox1.Items.Add("SenderVersion: " + m.SenderVersion.ToString());
    }
Az üzeneteket nem csak a Receive függvénnyel olvashatjuk, hanem lehetőségünk van azokat oly módon is kiolvasni, hogy továbbra is az adott fiókban maradjanak, onnan ne legyenek törölve. Ehhez a Receive függvény helyett a Peek függvényt kell használnunk, melynek paraméterezése megegyezik a Receive függvénnyel.
    private void button3_Click(object sender, System.EventArgs e)
    {
        ...
        m = mq.Peek(new TimeSpan(0, 0, 0, 1, 0));      
        ShowInfo(m);
        ...
    }
Ha az összes üzenetet szeretnénk feldolgozni egy lépésben, akkor lehetőségünk van egy foreach ciklussal végigmenni az üzenetek tömbjén, melyet a GetAllMessage függvény ad. A tömb elemei Message típusú objektumok, így a ShowInfo-nak egyszerűen átadhatók megjelenítésre.
    private void button4_Click(object sender, System.EventArgs e)
    {
        ...
        foreach(System.Messaging.Message m in mq.GetAllMessages())
        {
          ShowInfo(m);
          listBox1.Items.Add("----");
        }
        ...
    }
Az összes üzenet törlésére is van lehetőségünk. Ehhez csak a Purge függvényt kell meghívnunk.
    private void button5_Click(object sender, System.EventArgs e)
    {
      MessageQueue mq = new MessageQueue(MQPath);
      mq.Purge();
    }

Message Queue cikksorozat

Message Queuing programozása - Message Queue 1. rész

Message Queue további lehetőségei - Message Queue 2. rész