Bir MSMQ örnek uygulaması yazmak için gereken minimum minimum tutar


112

Bir saatten fazla bir süredir araştırıyorum ve MSMQ'nun C #'da nasıl kullanılacağına dair harika örnekler buluyorum ve hatta Message Queue hakkında bir kitabın tam bir bölümünü buluyorum ... Ancak hızlı bir test için tek ihtiyacım olan bu senaryo, hatta mükemmel bir şekilde, sadece hızlı bir demo için:

"Uygulama A": Mesaj Kuyruğuna bir Mesaj yazar. (Uygulama A bir C # windows hizmetidir) Şimdi "Uygulama B" yi açıyorum (bu bir C # winForms uygulamasıdır) ve MSMQ'yu kontrol ediyorum ve yeni bir Mesajım olduğunu görüyorum.

İşte bu ... Basit bir demo için ihtiyacım olan tek şey.

Herhangi biri bunun için bir kod örneği konusunda bana yardımcı olabilir mi? Çok minnettarım.


14
aşağı oy ne için? Konuyla ilgili bir şey biliyorsanız, Tamam geri kalanımıza öğretin.
Bohn

4
@Sascha: Yazımın başlangıcını okuyun: "Bir saatten fazla bir süredir araştırma yapıyorum ve MSMQ'nun C # 'da nasıl kullanılacağına dair harika örnekler ve hatta Mesaj Kuyruğu hakkında bir kitabın tam bir bölümünü buluyorum ... Ancak hızlı bir test için hepsi Bu senaryoyu ele almam gerekiyor, mükemmel bir şekilde bile değil, sadece hızlı bir demo için "
Bohn


Yanıtlar:


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

Daha karmaşık senaryo için, mesajı göndermek, kendi sınıf nesnenizi içine sarmak ve sınıfınızı serileştirilebilir olarak işaretlemek için Mesaj nesnelerini kullanabilirsiniz. Ayrıca MSMQ'nun sisteminizde kurulu olduğundan emin olun


1
Soru: MessageQueue'yu oluşturduğunuzda, bunların ikisine de ihtiyacımız var mı? MessageQueue.Create (@ "\ Özel $ \ SomeTestName."); messageQueue = new MessageQueue (@ ". \ Özel $ \ BazıTestName");
Bohn

3
Evet, her iki ifadeye de ihtiyacınız var, biri aslında bir MSMQ oluşturuyor ve diğeri MSMQ'yu yolla başlatıyor
Anand

6
bir cazibe gibi çalıştı ... Umarım bugün dileklerinizden biri gerçekleşir ... Bugün benim için büyük bir şeyi çözdünüz.
Bohn

2
Küçük yazım hatası: messageQueue = new MessageQueue (@ ". \ Özel $ \ BazıTestName"); System.Messaging.Message [] mesajlar = queue.GetAllMessages (); SH: messageQueue = new MessageQueue (@ ". \ Özel $ \ BazıTestAdı"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen

4
Sıranın çıktısını konsola yazdırmak için, çıkış döngüsünün gövdesine "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ());". MSMQ, nesneleri serileştirilmiş nesneler olarak etrafta dolaştırırken, ona, aldığı nesnelerin orijinal biçimlerine nasıl dizilişini kaldıracağını söylemeniz gerekir.
Contango

16

Belki de aşağıdaki kod, birisinin MSMQ'ya hızlı bir giriş yapması için faydalı olacaktır .

Bu yüzden başlamak için bir çözümde 3 uygulama oluşturmanızı öneririm:

  1. MessageTo (Windows Formu) 1 düğmesi ekleyin.
  2. MessageFrom (Windows Formu) 1 zengin metin kutusu ekleyin.
  3. MyMessage (Sınıf Kitaplığı) 1 sınıf ekleyin.

Sadece eski kodu kopyalayın ve deneyin. MSMQ'nun MS Windows'unuzda kurulu olduğundan ve 1 ve 2 numaralı projelerin referansına sahip olduğundan emin olun System.Messaging.

1. MessageTo (Windows Formu) 1 düğmesi ekleyin.

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 (Windows Formu) 1 zengin metin kutusu ekleyin.

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. Myessage (Sınıf Kitaplığı) 1 sınıf ekleyin.

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Zevk almak :)


1
MSQueue iş parçacığı güvenli mi? Aynı MSQueue'yu kullanan birden fazla EXE uygulaması mı? GetAllMessages ve Purgue hakkında ne var?
Kiquenet

@Kiquenet quora.com/… Size yardımcı olacağını umuyorum
Geliştirici
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.