Mức tối thiểu cần thiết để viết một ứng dụng mẫu MSMQ


112

Tôi đã nghiên cứu trong hơn một giờ và tìm thấy những mẫu tuyệt vời về cách sử dụng MSMQ trong C # và thậm chí là một chương đầy đủ của cuốn sách về Hàng đợi Thư ... Nhưng để kiểm tra nhanh, tất cả những gì tôi cần chỉ là tình huống này, thậm chí không một cách hoàn hảo, chỉ để có bản demo nhanh:

"Ứng dụng A": Viết tin nhắn vào hàng đợi tin nhắn. (Ứng dụng A là một dịch vụ cửa sổ C #) Bây giờ tôi mở "Ứng dụng B" (đó là một ứng dụng C # winForms) và tôi kiểm tra MSMQ và tôi thấy ồ, tôi có Tin nhắn mới.

Đó là nó ... Tất cả những gì tôi cần cho một bản demo đơn giản.

Bất cứ ai có thể vui lòng giúp tôi với một mẫu mã cho điều này? Nhiều đánh giá cao.


14
bỏ phiếu cho cái gì? Nếu bạn biết điều gì đó về chủ đề này, Ok hãy dạy cho những người còn lại.
Bohn

4
@Sascha: đọc phần đầu bài đăng của tôi: "Tôi đã nghiên cứu trong hơn một giờ và tìm thấy các mẫu tuyệt vời về cách sử dụng MSMQ trong C # và thậm chí một chương đầy đủ của cuốn sách về Hàng đợi Thư ... Nhưng để kiểm tra nhanh tất cả Tôi cần phải bao gồm kịch bản này, thậm chí không phải theo cách hoàn hảo, chỉ để có một bản demo nhanh "
Bohn


Kiểm tra bài viết MSDN này cũng như msdn.microsoft.com/en-us/library/…
Nhà phát triển

Câu trả lời:


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

Đối với kịch bản phức tạp hơn, bạn có thể sử dụng các đối tượng Message để gửi tin nhắn, bọc đối tượng lớp của riêng bạn bên trong nó và đánh dấu lớp của bạn là có thể tuần tự hóa. Ngoài ra, hãy chắc chắn rằng MSMQ đã được cài đặt trên hệ thống của bạn


1
Câu hỏi: ở trên cùng mà bạn đang tạo MessageQueue, chúng ta cần cả hai cái này? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn

3
Có, bạn cần cả hai tuyên bố, ai thực sự creats một MSMQ và người kia chỉ intializes MSMQ với đường dẫn
Anand

6
làm việc như một cái duyên ... Hy vọng một trong những điều ước của bạn sẽ thành hiện thực ngày hôm nay ... Bạn đã giải quyết được một việc lớn cho tôi hôm nay.
Bohn

2
Lỗi đánh máy nhỏ: messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = queue.GetAllMessages (); Sẽ là messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] messages = messageQueue.GetAllMessages ();
Kjensen

4
Để in đầu ra của hàng đợi tới bảng điều khiển, trong phần nội dung của vòng lặp đầu ra, hãy thêm "message.Formatter = new XmlMessageFormatter (new String [] {" System.String, mscorlib "}); Console.Write (message.Body .ToString ()); ". Khi MSMQ chuyển mọi thứ xung quanh dưới dạng các đối tượng được tuần tự hóa, bạn phải cho nó biết cách giải mã hóa các đối tượng nhận được về dạng ban đầu của chúng.
Contango

16

Có lẽ đoạn mã dưới đây sẽ hữu ích cho một người nào đó chỉ cần giới thiệu nhanh về MSMQ .

Vì vậy, để bắt đầu, tôi khuyên bạn nên tạo 3 ứng dụng trong một giải pháp:

  1. MessageTo (Windows Form) Thêm 1 nút.
  2. MessageFrom (Windows Form) Thêm 1 hộp văn bản đa dạng.
  3. MyMessage (Thư viện lớp) Thêm 1 lớp.

Chỉ cần sao chép mã quá khứ và thử nó. Đảm bảo rằng MSMQ được cài đặt trên MS Windows của bạn và các dự án 1 và 2 có tham chiếu đến System.Messaging.

1. MessageTo (Windows Form) Thêm 1 nút.

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) Thêm 1 hộp văn bản đa dạng.

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 (Thư viện lớp) Thêm 1 lớp.

using System;

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

        public DateTime BornPoint { get; set; }

        public string Text { get; set; }
    }
}

Thưởng thức :)


1
Chủ đề MSQueue an toàn? Nhiều ứng dụng EXE sử dụng cùng một MSQueue? Còn GetAllMessages và Purgue thì sao?
Kiquenet

@Kiquenet quora.com/… Tôi hy vọng nó sẽ giúp ích cho bạn
Nhà phát triển
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.