프로그래밍/RabbitMQ

[RabbitMQ] 메시지 송수신 - Helloworld

Victory_HA 2023. 3. 30. 19:42

메시지 송/수신

  • RabbitMQ Publisher, RabbitMQ Consumer 2개 솔루션 생성해야합니다.
    • Publisher : 메시지 발행
    • Consumer : 메시지 수신
  • RabbitMQ.Client nugetpackage 설치합니다.
    • v6.5.0

RabbitMQ-Publisher

  • ConnectionFactory 클래스의 인스턴스 생성 : RabbitMQ 서버 접속을 위한 로그인 정보를 설정합니다.
  • QueueDeclare 메소드를 사용하여 "hello"라는 큐를 선언합니다.
  • BasicPublish 메소드를 사용하여 메시지를 전송합니다.
    • exchange: 브로커에서 사용하는 exchange를 지정합니다. 여기에서는 빈 문자열을 지정하여 디폴트 exchange를 사용합니다.
    • routingKey: 전송할 큐의 이름을 지정합니다.
    • basicProperties: 메시지의 속성을 지정하는 데 사용됩니다. 이 예제에서는 null을 지정하여 기본값을 사용합니다.
    • body: 전송할 메시지의 내용을 지정합니다. 이 예제에서는 콘솔에서 입력받은 문자열을 UTF-8 인코딩하여 사용합니다.
using RabbitMQ.Client;
using System.Text;

Console.WriteLine("RabbitMQ_Pub");

// Create a connection factory
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "192.168.70.33";
factory.UserName = "guest";
factory.Password = "guest";

// Connection server
var connection = factory.CreateConnection();

// Create a channel
var channel = connection.CreateModel();
channel.QueueDeclare("hello", false, false, false, null);

// Send Message
while (true)
{
    string message = Console.ReadLine();

    if(message.Equals("x"))
        break; 

    channel.BasicPublish(
    exchange: "",
    routingKey: "hello",
    basicProperties: null,
    body: Encoding.UTF8.GetBytes(message));

    Console.WriteLine("Send : {0}", message);
}

Console.ReadLine();

RabbitMQ-Consumer

  • Consumer 등록 : EventingBasicConsumer 클래스의 인스턴스를 생성하여 RabbitMQ 브로커로부터 메시지를 비동기적으로 수신할 수 있도록 해주는 이벤트 핸들러를 제공합니다.
  • Received : 메시지가 수신되면 호출되며, 수신된 메시지를 처리하는 코드를 포함합니다. 수신된 메시지의 바이트 배열을 문자열로 변환하고, 콘솔에 출력합니다.
  • BasicConsume() : "hello" 큐의 메시지를 수신합니다.
using RabbitMQ.Client;
using RabbitMQ.Client.Events;
using System.Text;

Console.WriteLine("RabbitMQ_Sub");

// Create a connection factory
ConnectionFactory factory = new ConnectionFactory();
factory.HostName = "192.168.70.33";
factory.UserName = "guest";
factory.Password = "guest";
var connection = factory.CreateConnection();

// Declare channel
var channel = connection.CreateModel();
channel.QueueDeclare("hello", false, false, false, null);

var consumer = new EventingBasicConsumer(channel);

// Receive message
consumer.Received += (model, ea) =>
{
    var body = ea.Body.ToArray();
    var message = Encoding.UTF8.GetString(body);
    Console.WriteLine(" Receiv : {0}", message);
};

channel.BasicConsume(
    queue: "hello",
    autoAck: true,
    consumer: consumer);

Console.ReadLine();