NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# [MSMQ] Sender와 Receiver를 이용한 메세지 주고 받기 프로젝트.

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. MSMQ 서버 구축 프로젝트를 진행하기 위해 여러가지 테스트를 진행하고 있습니다. 이전 시간에는 MSMQ를 하나의 프로젝트에 Sender와 Receiver를 만들고 진행했는데요. 오늘은 개별 프로그램(프로세스, Process)으로 Sender와 Receivcer를 만들어서 메세지를 주고 받는걸 테스트 해보도록 하겠습니다. 자~ 우선, 이전 시간에 만든 프로젝트를 Visual Studio로 열고, 코드를 아래와 같이 수정 해줍니다.

    Receiver Application

    using System;
    using System.Messaging;
    
    namespace MSPC
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                MessageQueue myQueue = null;
    
                if (MessageQueue.Exists(".\\Private$\\NewQueue"))
                    myQueue = new System.Messaging.MessageQueue(".\\Private$\\NewQueue");
                else
                    myQueue = MessageQueue.Create(".\\Private$\\NewQueue");
    
                while (myQueue.CanRead)
                {
                    Message msg = myQueue.Receive();
                    msg.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });
                    Console.WriteLine(msg.Body.ToString());
                }
            }
        }
    }

     

    메세지를 큐로 전송하는 Send 부분만 삭제한 상태입니다. Sender를 만들기 위해 비주얼 스튜디오에서 새로운 콘솔 프로젝트를 추가 해줍니다. 아래 그림처럼요~

    0FAe7c7.png

     

     

    아래는 Sender의 전체 코드입니다. 코드가 그리 복잡하지는 않습니다. 생각보다 단순하죠?

    Sender Application

    using System.Messaging;
    
    namespace Sender
    {
        internal class Program
        {
            static void Main(string[] args)
            {
                MessageQueue myQueue = null;
    
                if (MessageQueue.Exists(".\\Private$\\NewQueue"))
                    myQueue = new System.Messaging.MessageQueue(".\\Private$\\NewQueue");
                else
                    myQueue = MessageQueue.Create(".\\Private$\\NewQueue");
    
                myQueue.Send("Welcome to NGMsoftware!");
            }
        }
    }

     

    메세지를 수신할 Receiver(MSPC) 프로젝트를 실행하세요. 그리고, Sender 프로젝트를 빌드한 폴더(bin/Debug)로 이동해줍니다. 아래 동영상처럼 Sender.exe를 실행하면 Receiver(MSPC) 프로그램에서 메세지를 수신하게 됩니다. Sender를 실행할 때 마다 메세지가 도착하는걸 알 수 있습니다.

    Yhe14lp.gif

     

     

    내부적으로 어떻게 작동하고 있는지는 모르겠지만, 이전 프로젝트에서 볼 수 없는 코드가 한줄 추가 되었습니다. 동일한 프로그램 안에서는 포메터 에러가 발생하지 않았습니다. 그런데, 프로젝트를 분리하고 실행해보니 "System.InvalidOperationException: '이 메시지를 읽을 수 있는 포맷터를 찾을 수 없습니다.'"와 같은 에러가 발생합니다.

    msg.Formatter = new XmlMessageFormatter(new String[] { "System.String,mscorlib" });

     

    포메터를 사용하면 이 에러를 해결할 수 있습니다. 아마 Sender에서 메세지 포메터(Formatter)를 설정하지 않으면 자동으로 Xml로 시리얼라이즈(Serialize, 직렬화)되는거 같습니다. 그리고, Receiver에서 메세지를 수신할 때 포메터가 없으면 어떤 형식인지 알 수 없어서 에러를 발생시키는듯 보입니다. 그래서, Xml로 디시리얼라이즈(Deserialize, 역직렬화)한 후 메세지 바디(Body)를 가져왔습니다. 참고로, 메세지의 바디는 스트림을 제공하고 있으니 아래와 같이 내용을 읽을수도 있습니다.

                    StreamReader sr = new StreamReader(msg.BodyStream);
                    string messageBody = "";
                    while (sr.Peek() >= 0)
                    {
                        messageBody += sr.ReadLine();
                    }
                    Console.WriteLine(messageBody);

     

    스트림으로 읽으면 아래와 같이 메세지 내용을 확인할 수 있습니다.

    <?xml version="1.0"?><string>Welcome to NGMsoftware!</string>

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.