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();
}