728x90
반응형
안녕하세요! 오랜만에 글을 작성해봅니다. 올해 처음인가봐요 ㅡㅡ; (다행히 아닙니다. ㅎㅎ)
MSMQ는 윈도우 OS에서 제공하는 Microsoft Message Queue 입니다. 이를 사용하기 위해서는 제어판 > 윈도우 기능 켜기/끄기에서 활성화 해주셔야 합니다.
본 글에서 테스트 한 메시지 형태는 클래스 형태로 만들어 상호 교환되는 것을 확인하는 소스입니다.
XML방식을 직렬화 및 역직렬화를 하는데 속도가 느리다는 글이 있네요. 그래서 아래 참조 글 중 JSON방식의 포맷터를 사용한 테스트 코드를 올려봅니다.
다음 두 개의 클래스를 추가합니다.
public class Order
{
public long orderId;
public DateTime orderTime;
};
public class EnDevMessageQueue
{
/// <summary>
/// MSMQ에 QueuePath 주소가 있는지 확인하고 없으면 생성
/// </summary>
/// <param name="QueuePath">ex: @".\Private$\EndevTest"</param>
public static void CreateQueue(string QueuePath)
{
if (MessageQueue.Exists(QueuePath))
{
MessageQueue.Delete(QueuePath);
MessageQueue.Create(QueuePath);
}
}
public static void SendQueue(string QueuePath, string Label, object SendMsg)
{
MessageQueue messageQueue = null;
if (MessageQueue.Exists(QueuePath))
{
messageQueue = new MessageQueue(QueuePath);
messageQueue.Label = Label;
}
else
{
// Create the Queue (큐생성없이 SendQueue를 실행했을 때의 예외처리)
MessageQueue.Create(QueuePath);
messageQueue = new MessageQueue(QueuePath);
messageQueue.Label = Label;
}
messageQueue.Formatter = new JsonMessageFormatter();
messageQueue.Send(SendMsg);
}
public static object[] RecvQueue(string QueuePath)
{
MessageQueue messageQueue = new MessageQueue(QueuePath);
messageQueue.Formatter = new JsonMessageFormatter();
Message[] messages = messageQueue.GetAllMessages();
List<object> lstObj = new List<object>();
foreach (Message message in messages)
{
lstObj.Add(message.Body);
}
return lstObj.ToArray();
}
public static Message[] GetMessages(string QueuePath)
{
MessageQueue messageQueue = new MessageQueue(QueuePath);
messageQueue.Formatter = new JsonMessageFormatter();
return messageQueue.GetAllMessages();
}
public static int Count(string QueuePath)
{
MessageQueue messageQueue = new MessageQueue(QueuePath);
return messageQueue.GetAllMessages().Length;
}
public static void PurgeQueue(string QueuePath)
{
MessageQueue messageQueue = new MessageQueue(QueuePath);
// after all processing, delete all the messages
messageQueue.Purge();
}
}
사용방법 (메시지 추가)
Order order = new Order();
order.orderId = DateTime.Now.ToFileTimeUtc;
order.orderTime = DateTime.Now;
EndevMessageQueue.SendQueue(@"\Private$\EndevTest", "EndevTest", order);
사용방법 (메시지 처리)
// 메시지 큐에 있는 모든 메시지 가져오기
Object[] orders = EnDevMessageQueue.RecvQueue(@".\Private$\EndevTest");
foreach (Object ord in orders)
{
Order order = cfg as Order;
Console.WriteLine(order.orderTime.ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
// 전체 메시지 삭제
EnDevMessageQueue.PurgeQueue(@".\Private$\EndevTest");
이제 숙제는 메시지 ID별로 처리하고 제거하는 형태로 만들어봐야겠네요. Rabbit MQ사용하다가 MSMQ를 사용하니 편의성이 현저하게 떨어지는... 다만 OS에서 지원하기 때문에 프로그램이 종료되어도 남아있는 장점이 있습니다. RabbitMQ의 경우 메시지 큐 프로세스가 종료되면 직전까지 가지고 있던 것을 파일로 가지고 있어서 재시작하면 종료되기 직전까지 가지고 있던 메시지를 처리할 수 있거든요.
참고)
https://gist.github.com/jchadwick/2430984
반응형
'개발 > C#' 카테고리의 다른 글
[2022.09] Webhook API를 이용한 로깅기법 (0) | 2022.09.08 |
---|---|
[2022.08] C# Dapper 불특정 테이블을 조회할 때 (0) | 2022.08.12 |
[2021.09] fo-DICOM Log4Net 사용방법 (0) | 2021.09.06 |
[2021.09] 입력문자가 어떤 언어인지 분별해주는 함수 (0) | 2021.09.04 |
[2021.06] C#에서 Cross-Thread Operation not valid 오류 (0) | 2021.06.09 |