■ 작업 큐를 사용하는 방법을 보여준다. (라운드 로빈 방식)
[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 |
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.QueueDeclare ( queue : "task_queue", durable : true, exclusive : false, autoDelete : false, arguments : null ); string message = GetMessage(argumentArray); byte[] messageArray = Encoding.UTF8.GetBytes(message); IBasicProperties properties = model.CreateBasicProperties(); properties.Persistent = true; model.BasicPublish ( exchange : "", routingKey : "task_queue", basicProperties : properties, body : messageArray ); WriteLog("송신 : {0}", message); } } Console.WriteLine("프로그램을 종료하려면 아무 키나 눌러 주시기 바랍니다."); Console.ReadKey(true); } #endregion #region 메시지 구하기 - GetMessage(argumentArray) /// <summary> /// 메시지 구하기 /// </summary> /// <param name="argumentArray">인자 배열</param> /// <returns>메시지</returns> private static string GetMessage(string[] argumentArray) { return ((argumentArray.Length > 0) ? string.Join(" ", argumentArray) : "Hello World!"); } #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 } } |
[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 |
using System; using System.Text; using System.Threading; using RabbitMQ.Client; using RabbitMQ.Client.Events; namespace TestConsumer { /// <summary> /// 프로그램 /// </summary> class Program { //////////////////////////////////////////////////////////////////////////////////////////////////// Method ////////////////////////////////////////////////////////////////////////////////////////// Static //////////////////////////////////////////////////////////////////////////////// Private #region 프로그램 시작하기 - Main() /// <summary> /// 프로그램 시작하기 /// </summary> private static void Main() { ConnectionFactory factory = new ConnectionFactory() { HostName = "localhost" }; using(IConnection connection = factory.CreateConnection()) { using(IModel model = connection.CreateModel()) { model.QueueDeclare ( queue : "task_queue", durable : true, exclusive : false, autoDelete : false, arguments : null ); model.BasicQos(prefetchSize : 0, prefetchCount : 1, global : false); WriteLog("메시지 대기..."); EventingBasicConsumer consumer = new EventingBasicConsumer(model); consumer.Received += (sender, e) => { byte[] messageArray = e.Body; string message = Encoding.UTF8.GetString(messageArray); WriteLog("수신 : {0}", message); int dotCount = message.Split('.').Length - 1; Thread.Sleep(dotCount * 1000); WriteLog("작업을 완료했습니다."); model.BasicAck ( deliveryTag : e.DeliveryTag, multiple : false ); }; model.BasicConsume ( queue : "task_queue", autoAck : false, 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 } } |