10 Ekim 2018

RabbitMQ için C# ile basit bir örnek

Programı kullanmak için ilk önce https://www.rabbitmq.com/download.html adresinden RabbitMQ kurmanız gerekiyor. Kurulum sırasında Erlang dilinin kurulumunu isterse http://www.erlang.org/downloads adresinden indirip kurduktan sonra tekrar kuruluma devama edin.

Yapılan örneğin aslını https://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html adresinden takip edebilirsiniz.

Kurulumdan sonra servisi başlatmak için Windows Başlat kısmından RabbitMQ Service - start aratılarak çıkan program ile başlatılır. Ve yine servisi durdurmak için Windows Başlat kısmından RabbitMQ Service - stop aratılarak çıkan programla durdurulur.

RabbitMQ için yapılacak tüm komutlar için yine başlat menüsünden RabbitMQ Command Prompt(sbin dir) ile komut satırı açılacaktır.

RabbitMQ için yönetim panelini kurarak görsel arayüze ulaşabilirsiniz.
Kurmak için RabbitMQ Command Prompt üzerinden aşağıda ki komut ile Management Plugin kurulur:

rabbitmq-plugins enable rabbitmq_management


Kurulum ile birlikte http://localhost:15672 üzerinde yönetim ekranına  ulaşabilirsiniz.
İlk gelen kullanıcı adı ve şifre "guest" olarak belirlenmiştir.

Detaylı kurulum için http://www.rabbitmq.com/management.html adresindeki adımları takip ediniz.


RabbitMQPublisher ve RabbitMQReceiver adında iki farklı "Console Project" açalım. Her iki proje için de RabbitMQ.Client   referansları projeye eklenmelidir.


Uygulamanın kodları aşağıdan görülebilir.
!RabbitMQPublisher için Program isimli sınıfın adı Send olarak değiştirildi fakat gerekli değildir.


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

namespace RabbitMQPublisher
{
    class Send
    {
        static void Main(string[] args)
        {


            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello",
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);
                var message = string.Empty;

                do
                {
                    Console.WriteLine("Send Message:");
                    message = Console.ReadLine();
                    var body = Encoding.UTF8.GetBytes(message);

                    channel.BasicPublish(exchange: "",
                                         routingKey: "hello",
                                         basicProperties: null,
                                         body: body);

                    Console.WriteLine(" [x] Sent {0}", message);
                    Console.WriteLine("Write empty input to exit.");

                } while (!string.IsNullOrWhiteSpace(message));

            }
        }
    }
}


!RabbitMQReceiver için Program isimli sınıfın adı Receive olarak değiştirildi fakat gerekli değildir.


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

namespace RabbitMQReceiver
{
    class Receive
    {
        static void Main(string[] args)
        {
            var factory = new ConnectionFactory() { HostName = "localhost" };
            using (var connection = factory.CreateConnection())
            using (var channel = connection.CreateModel())
            {
                channel.QueueDeclare(queue: "hello", 
                                     durable: false,
                                     exclusive: false,
                                     autoDelete: false,
                                     arguments: null);


                var consumer = new EventingBasicConsumer(channel);

                consumer.Received += (model, ea) =>
                {
                    var body = ea.Body;
                    var message = Encoding.UTF8.GetString(body);
                    Console.WriteLine(" [x] Received {0}", message);
                };

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

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

İleride detaylandırılacaktır.
İlk önce Receiver başlatılmak üzere iki programı da aynı anda açarsak. Aşağıda ki gibi Publisher üzerinden gönderilen mesaj iş kuyruğuna eklenecek ve Receiver tarafından kuyruktan alınıp işlenecektir.