ขั้นต่ำที่จำเป็นในการเขียนแอปพลิเคชันตัวอย่าง MSMQ


112

ฉันค้นคว้ามานานกว่าหนึ่งชั่วโมงและค้นหาตัวอย่างที่ยอดเยี่ยมเกี่ยวกับวิธีใช้ MSMQ ใน C # และแม้แต่บทเต็มของหนังสือเกี่ยวกับคิวข้อความ ... แต่สำหรับการทดสอบอย่างรวดเร็วสิ่งที่ฉันต้องการคือการครอบคลุมคือสถานการณ์นี้ไม่ใช่ด้วยซ้ำ อย่างสมบูรณ์แบบเพียงเพื่อการสาธิตอย่างรวดเร็ว:

"แอปพลิเคชัน A": เขียนข้อความไปยังคิวข้อความ (แอปพลิเคชัน A เป็นบริการ C # windows) ตอนนี้ฉันเปิด "แอปพลิเคชัน B" (เป็นแอป C # winForms) และฉันตรวจสอบ MSMQ และฉันเห็นว่าฉันมีข้อความใหม่

แค่นั้นแหละ ... ทั้งหมดที่ฉันต้องการสำหรับการสาธิตง่ายๆ

ใครช่วยฉันด้วยตัวอย่างโค้ดสำหรับสิ่งนี้ได้ไหม ชื่นชมมาก


14
ดาวน์โหวตเพื่ออะไร? ถ้าคุณรู้บางอย่างเกี่ยวกับหัวข้อนี้โอเคสอนพวกเราที่เหลือ
Bohn

4
@Sascha: อ่านจุดเริ่มต้นของโพสต์ของฉัน: "ฉันค้นคว้ามานานกว่าหนึ่งชั่วโมงและค้นหาตัวอย่างที่ยอดเยี่ยมเกี่ยวกับวิธีใช้ MSMQ ใน C # และแม้แต่บทเต็ม ๆ หนึ่งบทของหนังสือเกี่ยวกับคิวข้อความ ... แต่สำหรับการทดสอบอย่างรวดเร็วทั้งหมด ฉันต้องการที่จะครอบคลุมคือสถานการณ์นี้ไม่ได้เป็นวิธีที่สมบูรณ์แบบเพียงเพื่อการสาธิตอย่างรวดเร็ว "
Bohn

ได้รับปัญหาใน MSMQ stackoverflow.com/questions/29225601/…
Jitendra Pancholi

ตรวจสอบบทความ MSDN นี้ด้วย msdn.microsoft.com/en-us/library/…
พัฒนา

คำตอบ:


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

สำหรับสถานการณ์ที่ซับซ้อนยิ่งขึ้นคุณสามารถใช้วัตถุข้อความเพื่อส่งข้อความห่อออบเจ็กต์คลาสของคุณเองไว้ข้างในและทำเครื่องหมายชั้นเรียนของคุณให้เป็นอนุกรมได้ ตรวจสอบให้แน่ใจด้วยว่าได้ติดตั้ง MSMQ ในระบบของคุณแล้ว


1
คำถาม: ด้านบนที่คุณกำลังสร้าง MessageQueue เราต้องการทั้งสองอย่างนี้หรือไม่? MessageQueue.Create (@ "\ เอกชน $ \ SomeTestName."); messageQueue = MessageQueue ใหม่ (@ ". \ Private $ \ SomeTestName");
Bohn

3
ใช่คุณต้องมีทั้งสองคำสั่งอันหนึ่งสร้าง MSMQ จริง ๆ และอีกอันเพิ่งเริ่มต้น MSMQ ด้วยเส้นทาง
อานันท์

6
ทำงานอย่างมีเสน่ห์ ... หวังว่าวันนี้ความปรารถนาของคุณจะเป็นจริง ... วันนี้คุณแก้ไขเรื่องใหญ่ให้ฉันได้
Bohn

2
พิมพ์ผิดเล็ก ๆ : messageQueue = ใหม่ MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] ข้อความ = que.GetAllMessages (); ควรเป็น messageQueue = MessageQueue ใหม่ (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] ข้อความ = messageQueue.GetAllMessages ();
Kjensen

4
ในการพิมพ์เอาต์พุตของคิวไปยังคอนโซลในเนื้อหาของลูปเอาต์พุตให้เพิ่ม "message.Formatter = new XmlMessageFormatter (สตริงใหม่ [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ());" ในขณะที่ MSMQ ส่งผ่านสิ่งต่างๆไปรอบ ๆ เป็นวัตถุที่ทำให้เป็นอนุกรมคุณต้องบอกวิธีการแยกวัตถุที่ได้รับให้อยู่ในรูปแบบดั้งเดิม
Contango

16

บางทีโค้ดด้านล่างนี้จะเป็นประโยชน์สำหรับคนที่เพิ่งได้รับบทนำอย่างรวดเร็วเพื่อMSMQ

ดังนั้นในการเริ่มต้นฉันขอแนะนำให้คุณสร้าง 3 แอปในโซลูชัน:

  1. MessageTo (Windows Form) เพิ่ม 1 ปุ่ม
  2. MessageFrom (Windows Form) เพิ่ม 1 richtextbox
  3. MyMessage (ไลบรารีคลาส) เพิ่ม 1 คลาส

เพียงแค่คัดลอกรหัสที่ผ่านมาและลองใช้งาน ตรวจสอบให้แน่ใจว่าMSMQ มีการติดตั้งบน MS Windows ของคุณและโครงการที่ 1 และ 2 System.Messagingมีการอ้างอิงถึง

1. ปุ่ม MessageTo (Windows Form) เพิ่ม 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 (Windows Form) เพิ่ม 1 richtextbox

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) เพิ่ม 1 class

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

สนุก :)


1
MSQueue เธรดปลอดภัยหรือไม่? แอพ EXE หลายตัวที่ใช้ MSQueue เดียวกันหรือไม่? อะไรเกี่ยวกับ GetAllMessages และ Purgue?
Kiquenet

@Kiquenet quora.com/…ฉันหวังว่ามันจะช่วยคุณได้
พัฒนา
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.