C #에서 MSMQ를 사용하는 방법

MSMQ (Microsoft Message Queuing)는 Windows의 일부로 기본적으로 사용할 수있는 메시지 대기열입니다. 컴퓨터 시스템간에 메시지를 안정적으로 보내고받는 MSMQ는 확장 가능하고 스레드로부터 안전하며 간단하고 사용하기 편리한 큐를 제공하는 동시에 Windows 데이터베이스 내부에 메시지를 유지할 수있는 기회를 제공합니다. MSDN은 "MSMQ (Message Queuing) 기술을 사용하면 서로 다른 시간에 실행되는 응용 프로그램이 일시적으로 오프라인 상태 일 수있는 이기종 네트워크 및 시스템간에 통신 할 수 있습니다. 응용 프로그램은 메시지를 대기열로 보내고 대기열에서 메시지를 읽을 수 있습니다."

일반적으로 MSMQ로 작업 할 때 발신자와 수신자라는 두 가지 응용 프로그램이 있습니다. 발신자 (예 : 발신 응용 프로그램)가 메시지를 보낼 때 수신 응용 프로그램이 실행 상태 일 필요는 없습니다. 메시지는 실제로 호스트 운영 체제에서 유지 관리하는 대기열에 저장되며 메시지가 언제든 대기열에서 제거됩니다. 수신 신청서에 필요합니다.

대기열 생성

제어판의 "Windows 기능 켜기 또는 끄기"옵션을 통해 시스템에서 MSMQ를 켤 수 있습니다. MSMQ가 시스템에 설치되면 큐를 만드는 것은 간단합니다. "내 컴퓨터"로 이동하여 마우스 오른쪽 단추를 클릭하고 관리를 선택하십시오. "컴퓨터 관리"창에서 "메시지 큐"노드에서 새 큐를 만들 수 있습니다. 프로그래밍 방식으로 큐를 만들 수도 있습니다.

C #에서 MSMQ 프로그래밍

MSMQ로 작업하려면 System.Messaging 네임 스페이스를 포함해야합니다. 프로그래밍 방식으로 대기열을 만들려면 MessageQueue 클래스의 Create 메서드를 활용해야합니다. 다음 코드 스 니펫은이를 보여줍니다.

MessageQueue.Create(@".\Private$\");

큐를 만들고 여기에 메시지를 보내려면 다음 코드 조각을 사용할 수 있습니다.

MessageQueue.Create(@".\Private$\");              

messageQueue = new MessageQueue(@".\Private$\");

messageQueue.Label = "This is a test queue.";

messageQueue.Send("This is a test message.", "");

이제 큐가 있는지 확인하고있는 경우 메시지를 보내고 싶다고 가정합니다. 대기열이 없으면 새 대기열을 만든 다음 메시지를 보낼 수 있습니다. 이것이 바로 다음 코드 목록이하는 일입니다.

static void Main(string[] args)

        {

            MessageQueue messageQueue = null;

            string description = "This is a test queue.";

            string message = "This is a test message.";

            string path = @".\Private$\";

            try

            {

                if (MessageQueue.Exists(path))

                {

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                else

                {

                    MessageQueue.Create(path);

                    messageQueue = new MessageQueue(path);

                    messageQueue.Label = description;

                }

                messageQueue.Send(message);

            }

            catch

            {

                throw;

            }

finally

{

           messageQueue.Dispose();

}

      }

다음 코드 목록은 C #을 사용하여 메시지 큐에 저장된 메시지를 처리하는 방법을 보여줍니다.

private static List ReadQueue(string path)

        {

            List lstMessages = new List();

            using (MessageQueue messageQueue = new MessageQueue(path))

            {

                System.Messaging.Message[] messages = messageQueue.GetAllMessages();

                foreach (System.Messaging.Message message in messages)

                {

                    message.Formatter = new XmlMessageFormatter(

                    new String[] { "System.String, mscorlib" });

                    string msg = message.Body.ToString();

                    lstMessages.Add(msg);

                }

            }

            return lstMessages;

        }

다음으로 ReadQueue 메서드를 호출하여 아래 코드 조각에 표시된대로 메시지 대기열에 저장된 메시지를 검색 할 수 있습니다.

string path = @".\Private$\";

List lstMessages = ReadQueue(path);

메시지 대기열에 개체를 저장할 수도 있습니다. 예를 들어 큐에 로그 메시지를 저장해야한다고 가정합니다. 로그 메시지는 로그 메시지의 세부 정보와 관련된 필수 속성을 포함하는 LogMessage 클래스의 인스턴스에 저장됩니다. LogMessage 클래스의 모습은 다음과 같습니다. 두 개의 속성만으로 간단하게 만들었습니다.

public class LogMessage

    {

        public string MessageText { get; set; }

        public DateTime MessageTime { get; set; }

    }

다른 필수 속성 (예 : 메시지 심각도 등)을 통합하도록 LogMessage 클래스를 수정해야합니다. 다음 메서드는 LogMessage 클래스의 인스턴스를 메시지 큐에 저장할 수있는 방법을 보여줍니다.

private static void SendMessage(string queueName, LogMessage msg)

        {

            MessageQueue messageQueue = null;

            if (!MessageQueue.Exists(queueName))

                messageQueue = MessageQueue.Create(queueName);

            else

                messageQueue = new MessageQueue(queueName);          

            try

            {

                messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });

                messageQueue.Send(msg);

            }

            catch

            {

                //Write code here to do the necessary error handling.

            }

            finally

            {

                messageQueue.Close();

            }          

        }

다음 코드 조각은 LogMessage 클래스의 인스턴스를 만들고 데이터로 채운 다음 SendMessage 메서드를 호출하여 메시지 큐에 생성 된 인스턴스를 저장하는 방법을 보여줍니다.

LogMessage msg = new LogMessage()

            {

                MessageText = "This is a test message.",

                MessageTime = DateTime.Now

            };

SendMessage(@".\Private$\Log", msg);

다음 코드 목록은 메시지 큐에 저장된 LogMessage 인스턴스를 읽는 방법을 보여줍니다.

private static LogMessage ReceiveMessage(string queueName)

        {

            if (!MessageQueue.Exists(queueName))

                return null;

            MessageQueue messageQueue = new MessageQueue(queueName);

            LogMessage logMessage = null;

            try

            {

                messageQueue.Formatter = new XmlMessageFormatter(new Type[] { typeof(LogMessage) });

                logMessage = (LogMessage)messageQueue.Receive().Body;

            }

            catch { }

            finally

            {

                messageQueue.Close();

            }

            return logMessage;

        }