[RabbitMQ] C# 서비스로 WorkQueue, Exchange 구현

참조


목적

  • C# 코드로 RabbitMQ 연결하여 WorkQueue, Exchange 구현 하도록 코드 작성 진행합니다.
  • Work Queue 의 역할은 RabbitMQ 의 Queue 에 메시지를 저장하여 Consumer 에게 전달 하도록 하는 역할을 합니다.
  • Exchange 는 Consumer 가 작업을 완료 한 후, Excnage 방식으로 RabbitMQ 에 메시지를 저장할 시, 해당 결과값을 출력하는 역할을 합니다.

예제 코드

using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

var factory = new ConnectionFactory() { HostName = "localhost" };

using var connection = factory.CreateConnection();
using (var channel = connection.CreateModel())
{
    while (true)
    {
        Console.Write("보낼 메시지 입력 : ");
        string message = Console.ReadLine();

        if (message == "exit")
        {
            break;
        }

        WorkTask(message, channel);
        ExchangeTask(channel);
    }
}

// 작업 큐
void WorkTask(string message, IModel channel)
{
    channel.QueueDeclare(queue: "tf_serving_queue",
                durable: true, // 메시지가 수행되어야 큐에서 삭제 되도록
                exclusive: false,
                autoDelete: false,
                arguments: null);

    var body = Encoding.UTF8.GetBytes(message);

    var properties = channel.CreateBasicProperties();
    properties.Persistent = true;

    channel.BasicPublish(exchange: "",
                         routingKey: "tf_serving_queue",
                         basicProperties: properties,
                         body: body);

    Console.WriteLine(" [x] Sent {0}", message);
}


// Exchange 
void ExchangeTask(IModel channel)
{
    channel.ExchangeDeclare(exchange: "tf_serving_queue", type: "fanout");

    var queueName = channel.QueueDeclare().QueueName;
    channel.QueueBind(queue: queueName,
                      exchange: "tf_serving_queue",
                      routingKey: "");

    Console.WriteLine(" [*] Waiting for logs.");

    var consumer = new EventingBasicConsumer(channel);
    consumer.Received += (model, ea) =>
    {
        var body = ea.Body.ToArray();
        var message = Encoding.UTF8.GetString(body);
        Console.WriteLine(" [x] {0}", message);
    };
    channel.BasicConsume(queue: queueName,
                         autoAck: true,
                         consumer: consumer);

    Console.WriteLine(" Press [enter] to exit.");
    Console.ReadLine();
}

실행 결과

  • 아래와 같이 메시지를 2개 보냈습니다.
  • 실제로 RabbitMQ 에 2개의 메시지가 Queue 에 저장 되었는지 확인하였습니다.
보낼 메시지 입력 : input
 [x] Sent input
 [*] Waiting for logs.
 Press [enter] to exit.

보낼 메시지 입력 : input
 [x] Sent input
 [*] Waiting for logs.
 Press [enter] to exit.

RabbitMQ Manager 에서 Queue 확인

  • 확인 결과, Queue 에 2개의 메시지가 저장되어 있는 것을 확인할 수 있습니다.


728x90

이 글을 공유하기

댓글

Designed by JB FACTORY