MSMQ 샘플 응용 프로그램을 작성하는 데 필요한 최소한
나는 한 시간 이상 연구하고 C #에서 MSMQ를 사용하는 방법과 Message Queue에 대한 책의 전체 장을 훌륭한 샘플을 발견했습니다 ... 그러나 빠른 테스트를 위해 필요한 것은이 시나리오뿐 아니라 간단한 데모를 위해 완벽한 방법으로 :
"응용 프로그램 A": Message Queue에 메시지를 씁니다. (응용 프로그램 A는 C # Windows 서비스입니다.) 이제 "응용 프로그램 B"(C # winForms 앱)를 열고 MSMQ를 확인하면 새로운 메시지가 나타납니다.
그게 다야 ... 간단한 데모를 위해 필요한 모든 것.
누구든지 이것에 대한 코드 샘플을 도와 줄 수 있습니까? 매우 감사.
//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가 시스템에 설치되어 있는지 확인하십시오
아마도 아래 코드는 누군가가 MSMQ를 빠르게 소개하는 데 유용 할 것 입니다.
따라서 솔루션에서 3 개의 앱을 만드는 것이 좋습니다.
- MessageTo (Windows Form) 1 버튼을 추가하십시오.
- MessageFrom (Windows Form) 1 개의 서식있는 텍스트 상자를 추가하십시오.
- 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 (클래스 라이브러리) 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; }
}
}
즐겨 :)
'IT박스' 카테고리의 다른 글
Java의 다중 스레드 환경에서 정적 메소드 동작 (0) | 2020.07.30 |
---|---|
부트 스트랩 테이블 줄무늬 : 줄무늬 배경색을 어떻게 변경합니까? (0) | 2020.07.30 |
Visual Studio Code에서 git history를 어떻게 볼 수 있습니까? (0) | 2020.07.29 |
제목 줄의 시작 부분에서만 텍스트를 검색하는 Gmail 필터를 만드는 방법은 무엇입니까? (0) | 2020.07.29 |
RSpec : 기능과 요청 사양의 차이점은 무엇입니까? (0) | 2020.07.29 |