■ 패턴 기반 메시지 라우팅을 하는 방법을 보여준다.
[실행 방법]
1. 3개의 명령 프롬프트를 실행한다.
2. 첫번째 명령 프롬프트에서 TestConsumer.exe를 아래와 같이 실행한다.
▶ 실행 명령
1 2 3 |
TestConsumer.exe *.orange.* |
3. 두번째 명령 프롬프트에서 TestConsumer.exe를 아래와 같이 실행한다.
▶ 실행 명령
1 2 3 |
TestConsumer.exe *.*.rabbit lazy.# |
4. 세번째 명령 프롬프트에서 TestProducer.exe를 아래와 같이 실행한다.
▶ 실행 명령
1 2 3 |
TestProducer.exe |
[TestProducer 프로젝트]
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
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 : "topic_logs", type : "topic" ); SendMessage(model, "quick.orange.rabbit", "빠른, 오렌지, 토끼"); SendMessage(model, "lazy.orange.elephant", "느린, 오렌지, 코끼리"); SendMessage(model, "quick.orange.fox", "빠른, 오렌지, 여우"); SendMessage(model, "lazy.pink.rabbit", "느린, 핑크, 토끼"); SendMessage(model, "quick.brown.fox", "빠른, 브라운, 여우"); SendMessage(model, "quick.orange.male.rabbit", "빠른, 오렌지, 수컷, 여우"); SendMessage(model, "lazy.orange.male.rabbit", "느린, 오렌지, 수컷, 여우"); } } 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 : "topic_logs", routingKey : routingKey, basicProperties : null, body : messageArray ); WriteLog("송신 : {0}, {1}", routingKey, message); } #endregion } } |
[TestConsumer 프로젝트]
▶ Program.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
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 : "topic_logs", type : "topic" ); string queueName = model.QueueDeclare().QueueName; if(argumentArray.Length < 1) { Console.WriteLine("사용법 : {0} [binding_keys...]", Environment.GetCommandLineArgs()[0]); Console.WriteLine("프로그램을 종료하기 위해 아무 키나 눌러 주시기 바랍니다."); Console.ReadKey(true); Environment.ExitCode = 1; return; } foreach(string argument in argumentArray) { model.QueueBind ( queue : queueName, exchange : "topic_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 } } |