MSMQ 샘플 응용 프로그램을 작성하는 데 필요한 최소한


112

저는 한 시간 넘게 연구를 해왔고 C #에서 MSMQ를 사용하는 방법에 대한 훌륭한 샘플을 찾고 Message Queue에 대한 책의 한 장 전체를 찾았습니다 ...하지만 빠른 테스트를 위해 필요한 것은이 시나리오뿐입니다. 간단한 데모를 위해 완벽한 방법으로 :

"응용 프로그램 A": 메시지 큐에 메시지를 씁니다. (응용 프로그램 A는 C # Windows 서비스입니다.) 이제 "응용 프로그램 B"(C # winForms 응용 프로그램)를 열고 MSMQ를 확인하면 새 메시지가 있습니다.

그게 다야 ... 간단한 데모에 필요한 모든 것.

누구든지 이것에 대한 코드 샘플로 나를 도울 수 있습니까? 매우 감사.


14
반대표는 무엇입니까? 주제에 대해 알고 있다면 Ok는 나머지 우리에게 가르칩니다.
Bohn

4
@Sascha : 내 게시물의 시작 부분을 읽어보십시오. "저는 한 시간 넘게 C #에서 MSMQ를 사용하는 방법에 대한 훌륭한 샘플을 찾고 Message Queue에 대한 책의 한 장 전체를 찾았습니다. 그러나 빠른 테스트를 위해 모두 이 시나리오를 다룰 필요가 있습니다. 완벽한 방법이 아니라 빠른 데모를위한 것입니다. "
Bohn


이 MSDN 문서도 확인하십시오. msdn.microsoft.com/en-us/library/…
Developer

답변:


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

더 복잡한 시나리오의 경우 Message 객체를 사용하여 메시지를 보내고 자체 클래스 객체를 내부에 래핑하고 클래스를 직렬화 가능으로 표시 할 수 있습니다. 또한 MSMQ가 시스템에 설치되어 있는지 확인하십시오.


1
질문 : MessageQueue를 만들고있는 맨 위에이 두 가지가 모두 필요합니까? MessageQueue.Create (@ ". \ Private $ \ SomeTestName"); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName");
Bohn

3
네, 두 문장이 모두 필요합니다. 하나는 실제로 MSMQ를 만들고 다른 하나는 MSMQ를 경로로 초기화합니다
Anand

6
매력처럼 일 했어 ... 오늘 소원이 이루어 지길 바래 ... 오늘 내게 큰 일을 해결해 줬어.
Bohn

2
작은 오타 : messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] 메시지 = queue.GetAllMessages (); messageQueue = new MessageQueue (@ ". \ Private $ \ SomeTestName"); System.Messaging.Message [] 메시지 = messageQueue.GetAllMessages ();
Kjensen 2013-10-25

4
대기열의 출력을 콘솔에 인쇄하려면 출력 루프의 본문에 "message.Formatter = new XmlMessageFormatter (new String [] {"System.String, mscorlib "}); Console.Write (message.Body)를 추가합니다. .ToString ()); ". MSMQ는 사물을 직렬화 된 개체로 전달하므로받은 개체를 원래 형식으로 역 직렬화하는 방법을 알려야합니다.
Contango

16

아마도 아래 코드는 누군가 MSMQ를 빠르게 소개하는 데 유용 할 것 입니다.

시작하려면 솔루션에 3 개의 앱을 만드는 것이 좋습니다.

  1. MessageTo (Windows Form) 추가 1 단추.
  2. MessageFrom (Windows Form) 리치 텍스트 상자 1 개를 추가합니다.
  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 개를 추가합니다.

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 (클래스 라이브러리) 클래스 1 개를 추가합니다.

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 스레드로부터 안전합니까? 동일한 MSQueue를 사용하는 여러 EXE 앱? GetAllMessages 및 Purgue는 어떻습니까?
Kiquenet

@Kiquenet quora.com/… 도움이되기를 바랍니다
개발자
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.