첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

TestSolution.zip
다운로드

▶ 실행 방법

1. 3개의 명령 프롬프트를 실행한다.

2. 첫번째 명령 프롬프트에서 TestConsumer.exe를 아래와 같이 실행한다.

   TestConsumer.exe error

3. 두번째 명령 프롬프트에서 TestConsumer.exe를 아래와 같이 실행한다.

   TestConsumer.exe info warning

4. 세번째 명령 프롬프트에서 TestProducer.exe를 아래와 같이 실행한다.

   TestProducer.exe

 

728x90

 

[TestProducer 프로젝트]

▶ Program.cs

using System;
using System.Text;

using RabbitMQ.Client;

namespace TestProducer
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        /// <param name="argumentArray">인자 배열</param>
        private static void Main(string[] argumentArray)
        {
            ConnectionFactory factory = new ConnectionFactory() { HostName = "localhost" };

            using(IConnection connection = factory.CreateConnection())
            {
                using(IModel model = connection.CreateModel())
                {
                    model.ExchangeDeclare
                    (
                        exchange : "direct_logs",
                        type     : "direct"
                    );

                    SendMessage(model, "error", "에러가 발생했습니다.");

                    SendMessage(model, "info", "알림 사항이 발생했습니다.");

                    SendMessage(model, "warning", "경고 사항이 발생했습니다.");
                }
            }

            Console.WriteLine("프로그램을 종료하려면 아무 키나 눌러 주시기 바랍니다.");

            Console.ReadKey(true);
        }

        #endregion

        #region 로그 작성하기 - WriteLog(format, parameterArray)

        /// <summary>
        /// 로그 작성하기
        /// </summary>
        /// <param name="format">포맷 문자열</param>
        /// <param name="parameterArray">매개 변수 배열</param>
        private static void WriteLog(string format, params object[] parameterArray)
        {
            string message;

            if(parameterArray.Length == 0)
            {
                message = format;
            }
            else
            {
                message = string.Format(format, parameterArray);
            }

            string log = string.Format("[{0}] {1}", DateTime.Now.ToString("HH:mm:ss"), message);

            Console.WriteLine(log);
        }

        #endregion
        #region 메시지 보내기 - SendMessage(model, routingKey, message)

        /// <summary>
        /// 메시지 보내기
        /// </summary>
        /// <param name="model">모델</param>
        /// <param name="routingKey">라우팅 키</param>
        /// <param name="message">메시지</param>
        private static void SendMessage(IModel model, string routingKey, string message)
        {
            byte[] messageArray = Encoding.UTF8.GetBytes(message);

            model.BasicPublish
            (
                exchange        : "direct_logs",
                routingKey      : routingKey,
                basicProperties : null,
                body            : messageArray
            );

            WriteLog("송신 : {0}, {1}", routingKey, message);
        }

        #endregion
    }
}

 

300x250

 

[TestConsumer 프로젝트]

▶ Program.cs

using System;
using System.Text;

using RabbitMQ.Client;
using RabbitMQ.Client.Events;

namespace TestConsumer
{
    /// <summary>
    /// 프로그램
    /// </summary>
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main(argumentArray)

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        /// <param name="argumentArray">인자 배열</param>
        private static void Main(string[] argumentArray)
        {
            ConnectionFactory factory = new ConnectionFactory() { HostName = "localhost" };

            using(IConnection connection = factory.CreateConnection())
            {
                using(IModel model = connection.CreateModel())
                {
                    model.ExchangeDeclare
                    (
                        exchange : "direct_logs",
                        type     : "direct"
                    );

                    string queueName = model.QueueDeclare().QueueName;

                    if(argumentArray.Length < 1)
                    {
                        Console.WriteLine("사용법 : {0} [info] [warning] [errpr]", Environment.GetCommandLineArgs()[0]);

                        Console.WriteLine("프로그램을 종료하기 위해 아무 키나 눌러 주시기 바랍니다.");

                        Console.ReadKey(true);

                        Environment.ExitCode = 1;

                        return;
                    }

                    foreach(string argument in argumentArray)
                    {
                        model.QueueBind
                        (
                            queue      : queueName,
                            exchange   : "direct_logs",
                            routingKey : argument
                        );
                    }

                    WriteLog("메시지 대기...");

                    EventingBasicConsumer consumer = new EventingBasicConsumer(model);

                    consumer.Received += (sender, e) =>
                    {
                        string routingKey = e.RoutingKey;

                        byte[] messageArray = e.Body;

                        string message = Encoding.UTF8.GetString(messageArray);

                        WriteLog("수신 : {0}, {1}", routingKey, message);
                    };

                    model.BasicConsume
                    (
                        queue    : queueName,
                        autoAck  : true,
                        consumer : consumer
                    );

                    Console.WriteLine("프로그램을 종료하기 위해 아무 키나 눌러 주시기 바랍니다.");

                    Console.ReadKey(true);
                }
            }
        }

        #endregion
        #region 로그 작성하기 - WriteLog(format, parameterArray)

        /// <summary>
        /// 로그 작성하기
        /// </summary>
        /// <param name="format">포맷 문자열</param>
        /// <param name="parameterArray">매개 변수 배열</param>
        private static void WriteLog(string format, params object[] parameterArray)
        {
            string message;

            if(parameterArray.Length == 0)
            {
                message = format;
            }
            else
            {
                message = string.Format(format, parameterArray);
            }

            string log = string.Format("[{0}] {1}", DateTime.Now.ToString("HH:mm:ss"), message);

            Console.WriteLine(log);
        }

        #endregion
    }
}
728x90
반응형
그리드형(광고전용)
Posted by 사용자 icodebroker

댓글을 달아 주세요