Symfony ile RabbitMQ Kullanımı

By | 1 March 2017

Bu yazıda sizlere Symfony framework’ü üzerinde nasıl Rabbitmq kullanabiliriz, onu anlatacağım. Öncelikle Rabbitmq için gerekli olan paketi kurmamız gerekiyor.Bunun için aşağıdaki satırı, ‘composer.json içerisine ekliyoruz.

‘”php-amqplib/rabbitmq-bundle”: “~1.6”

Şimdi de paketi kuruyoruz. Aşağıdaki komutu çalıştırmak yeterli, böylece güncelleme varsa, onları da alıyoruz.

composer update

Başarılı bir şekilde işlem bittikten sonra Symfony’de AppKernel.php dosyamıza aşağıdaki gibi paketi ekliyoruz.

‘new OldSound\RabbitMqBundle\OldSoundRabbitMqBundle(),

Bu satırı da ekledikten sonra sıra geldi konfigürasyona. Bunun için Symfony/Config dosyamıza gidiyoruz ve aşağıdaki ayarları ekliyoruz.


# RabbitMQ Configuration
old_sound_rabbit_mq:
    connections:
        default:
            host:     "%queue_host%"    //parameters.yml içinden bu bilgileri alıyor.
            port:     "%queue_port%"
            user:     "%queue_user%"
            password: "%queue_password%"
            vhost:    '/'
            lazy:     true
    producers:
        cache:
            connection:        default
            exchange_options:  {name: 'cache', type: direct}  //exchange adı ve tipi
    consumers:
        cache:
            connection:        default   //bağlantının default conf altındaki parametreler üzerinden yapılacağı set ediliyor.
            exchange_options:  {name: 'cache', type: direct}  //exchange adı ve tipi
            callback:          consumer.cache     //mesajların kimin dinleyeceği set ediliyor.
            queue_options:     {name: 'cache'}    //rabbitmq kuyruğunun ismi
            qos_options:       {prefetch_size: 0, prefetch_count: 1, global: false}

Konfigürasyonu yaptıktan sonra kendi bundle’ımız altında ‘Consumer adında bir dizin oluşturuyoruz ve içine konfigürasyonda dediğimiz gibi ‘CacheConsumer adında bir dinleyici oluşturuyoruz. Burada aşağıdaki kodları ekliyoruz.

class CacheConsumer implements ConsumerInterface
{
  public function execute(AMQPMessage $data){
    try{
      $message = unserialize($data->body); //gelecek olan verinin içinden body kısmını alıyoruz.
      echo "Message -> " . $message;  //ve ekrana bastırıyoruz.
    }catch (BadResponseException $e){
      echo $e->getMessage();
    }
  }
}

Daha sonra mesajları gönderecek olan Symfony komutu oluşturacağım. Bunun için kendi bundle’ımız altında ‘Command adında bir dizin açıp, içine ‘DataCacherCommand adında dosyamızı oluşturuyoruz. İçini aşağıdaki gibi dolduruyorum.

class DataCacheCommand extends ContainerAwareCommand
{

  //komut konfigürasyonu ekleniyor.
  protected function configure(){
    $this
    ->setName('mertblog:data_cacher_command')
    ->setDescription('Hello MertBlog');
  }

  //komut çalıştırıldığında yapılacak işlemler
  protected function execute(InputInterface $input, OutputInterface $output){
    $data = array('mesaj-1', 'mesaj-2', 'mesaj-3');
    foreach($data as $message){
      //burada symfony konfigürasyonuna eklediğimiz producer üzerinden, kuyruğa mesajları yolluyor.
      $this->getContainer()->get('old_sound_rabbit_mq.cache_producer')->publish(
        serialize(array($message))
      );
    }
  }
}

Öncelikle dinleyicimizi çalıştırıyoruz.

app/console rabbitmq:consumer cache
[/php]

Komut dosyamızı da oluşturduktan sonra aşağıdaki satırı çalıştırarak kuyruğa mesaj gönderebilir ve mesajları alıp, işleyebilir hale geliyoruz.

app/console mertblog:data_cacher_command

Bu konu için anlatacaklarım şimdilik bu kadar, bir dahaki yazıda görüşmek üzere… 🙂

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*