Minimum minimal yang diperlukan untuk menulis aplikasi sampel MSMQ

112

Saya telah meneliti selama lebih dari satu jam dan menemukan contoh yang bagus tentang bagaimana menggunakan MSMQ di C # dan bahkan satu bab penuh dari sebuah buku tentang Antrian Pesan ... Tetapi untuk pengujian cepat yang saya butuhkan hanyalah membahas skenario ini, bahkan tidak dengan cara yang sempurna, hanya untuk demo singkat:

"Aplikasi A": Menulis Pesan ke Antrian Pesan. (Aplikasi A adalah layanan C # windows) Sekarang saya membuka "Aplikasi B" (ini adalah aplikasi C # winForms) dan saya memeriksa MSMQ dan saya melihat oh saya punya Pesan baru.

Itu saja ... Yang saya butuhkan untuk demo sederhana.

Adakah yang bisa membantu saya dengan contoh kode untuk ini? Sangat dihargai.

Bohn
sumber
14
untuk apa down vote? Jika Anda tahu sesuatu tentang topik tersebut, Ok ajari kami semua.
Bohn
4
@Sascha: baca awal posting saya: "Saya telah meneliti selama lebih dari satu jam dan menemukan contoh yang bagus tentang bagaimana menggunakan MSMQ di C # dan bahkan satu bab penuh dari sebuah buku tentang Antrian Pesan ... Tapi untuk tes cepat semua Yang saya butuhkan adalah untuk menutupi skenario ini, bahkan tidak dengan cara yang sempurna, hanya untuk demo singkat "
Bohn
Mendapatkan masalah di MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi
Periksa artikel MSDN ini juga msdn.microsoft.com/en-us/library/…
Pengembang

Jawaban:

131
//From Windows Service, use this code
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\SomeTestName"))
{
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Testing Queue";
}
else
{
    // Create the Queue
    MessageQueue.Create(@".\Private$\SomeTestName");
    messageQueue = new MessageQueue(@".\Private$\SomeTestName");
    messageQueue.Label = "Newly Created Queue";
}
messageQueue.Send("First ever Message is sent to MSMQ", "Title");

//From Windows application
MessageQueue messageQueue = new MessageQueue(@".\Private$\SomeTestName");
System.Messaging.Message[] messages = messageQueue.GetAllMessages();

foreach (System.Messaging.Message message in messages)
{
    //Do something with the message.
}
// after all processing, delete all the messages
messageQueue.Purge();

Untuk skenario yang lebih kompleks, Anda dapat menggunakan objek Message untuk mengirim pesan, membungkus objek kelas Anda sendiri di dalamnya, dan menandai kelas Anda sebagai dapat diserialkan. Pastikan juga bahwa MSMQ diinstal pada sistem Anda

Anand
sumber
1
Pertanyaan: Di bagian atas Anda sedang Membuat MessageQueue, kita membutuhkan keduanya? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = MessageQueue baru (@ ". \ Private $ \ SomeTestName");
Bohn
3
Ya, Anda memerlukan kedua pernyataan itu, yang satu benar-benar membuat MSMQ dan yang lainnya hanya menginisialisasi MSMQ dengan jalur
Anand
6
bekerja seperti pesona ... Semoga salah satu keinginan Anda menjadi kenyataan hari ini ... Anda memecahkan hal besar untuk saya hari ini.
Bohn
2
Kesalahan ketik kecil: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Seharusnya messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen
4
Untuk mencetak keluaran antrian ke konsol, di badan loop keluaran, tambahkan "message.Formatter = new XmlMessageFormatter (String baru [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ()); ". Saat MSMQ menyebarkan hal-hal sebagai objek serial, Anda harus memberitahukannya bagaimana cara deserialisasi objek yang diterima ke dalam bentuk aslinya.
Contango
16

Mungkin kode di bawah ini akan berguna bagi seseorang untuk mendapatkan pengenalan cepat ke MSMQ .

Jadi untuk memulai, saya sarankan Anda membuat 3 aplikasi dalam sebuah solusi:

  1. MessageTo (Formulir Windows) Tambahkan 1 tombol.
  2. MessageFrom (Formulir Windows) Tambahkan 1 kotak teks kaya.
  3. MyMessage (Perpustakaan Kelas) Tambahkan 1 kelas.

Cukup salin kode sebelumnya dan coba. Pastikan bahwa MSMQ diinstal pada MS Windows Anda dan proyek 1 dan 2 memiliki referensi System.Messaging.

1. Tombol MessageTo (Formulir Windows) Tambahkan 1.

using System;
using System.Messaging;
using System.Windows.Forms;

namespace MessageTo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {

            #region Create My Own Queue 

            MessageQueue messageQueue = null;
            if (MessageQueue.Exists(@".\Private$\TestApp1"))
            {
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }
            else
            {
                // Create the Queue
                MessageQueue.Create(@".\Private$\TestApp1");
                messageQueue = new MessageQueue(@".\Private$\TestApp1");
                messageQueue.Label = "MyQueueLabel";
            }

            #endregion

            MyMessage.MyMessage m1 = new MyMessage.MyMessage();
            m1.BornPoint = DateTime.Now;
            m1.LifeInterval = TimeSpan.FromSeconds(5);
            m1.Text = "Command Start: " + DateTime.Now.ToString();

            messageQueue.Send(m1);
        }
    }
}

2. MessageFrom (Formulir Windows) Tambahkan 1 kotak teks kaya.

using System;
using System.ComponentModel;
using System.Linq;
using System.Messaging;
using System.Windows.Forms;

namespace MessageFrom
{
    public partial class Form1 : Form
    {
        Timer t = new Timer();
        BackgroundWorker bw1 = new BackgroundWorker();
        string text = string.Empty;

        public Form1()
        {
            InitializeComponent();

            t.Interval = 1000;
            t.Tick += T_Tick;
            t.Start();

            bw1.DoWork += (sender, args) => args.Result = Operation1();
            bw1.RunWorkerCompleted += (sender, args) =>
            {
                if ((bool)args.Result)
                {
                    richTextBox1.Text += text;
                }
            };
        }

        private object Operation1()
        {
            try
            {
                if (MessageQueue.Exists(@".\Private$\TestApp1"))
                {
                    MessageQueue messageQueue = new MessageQueue(@".\Private$\TestApp1");
                    messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(MyMessage.MyMessage) });


                    System.Messaging.Message[] messages = messageQueue.GetAllMessages();

                    var isOK = messages.Count() > 0 ? true : false;
                    foreach (System.Messaging.Message m in messages)
                    {
                        try
                        {
                            var command = (MyMessage.MyMessage)m.Body;
                            text = command.Text + Environment.NewLine;
                        }
                        catch (MessageQueueException ex)
                        {
                        }
                        catch (Exception ex)
                        {
                        }
                    }                   
                    messageQueue.Purge(); // after all processing, delete all the messages
                    return isOK;
                }
            }
            catch (MessageQueueException ex)
            {
            }
            catch (Exception ex)
            {
            }

            return false;
        }

        private void T_Tick(object sender, EventArgs e)
        {
            t.Enabled = false;

            if (!bw1.IsBusy)
                bw1.RunWorkerAsync();

            t.Enabled = true;
        }
    }
}

3. MyMessage (Class Library) Tambahkan 1 kelas.

using System;

namespace MyMessage
{
    [Serializable]
    public sealed class MyMessage
    {
        public TimeSpan LifeInterval { get; set; }

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Nikmati :)

Pengembang
sumber
1
MSQueue thread-safe? Beberapa aplikasi EXE menggunakan MSQueue yang sama? Bagaimana dengan GetAllMessages dan Purgue?
Kiquenet
@Kiquenet quora.com/… Saya harap ini akan membantu Anda
Pengembang