Lib amqpcpp wrapper for librabbitmq

    За последние полтора года активно набирает популярность Сервер очередей RabbitMQ, который работает по протоколу AMQP. Про данный протокол уже было достаточно статей на Хабре. В инструментарии есть библиотека librabbitmq

    На основе этой библиотеке выложил в Google Code проект С++ библиотеки amqpcpp, которая является упрощенным интерфейсом к librabbitmq. Документации нет, примеров использования в дистрибутиве только три. Под кастом краткое изложение АПИ и примеры ее использования. Использование стало проще.

    Инсталляция


    очень проста: запускаем make-файл, в который компилит статическую библиотеку libamqpcpp.a
    там же в make-файле есть компиляция примеров:
    g++ -o example_get -lamqpcpp -lrabbitmq -Iamqpcpp -I/usr/local/include -L/usr/local/lib -L. example_get.cpp
    заменяем имя example_get на my_project и компилим. Пока configure не сделан, буду рад — если кто поможет мне его создать.

    Краткое описание АПИ


    Библиотекка включается #include "amqpcpp.h"

    Все публичные методы перечислены в Wiki проекта. Соглашение по именам: Все методы, которые определены в Протоколе AMQP начинаются с большой буквы, пример: Declare, Bind, Consume,Cancel etc.

    Класс Amqp — несет в себе две функции:
    • осуществляет соединение с брокером
    • является фабрикой для создания экземпляров классов «очередей» и «обменов» и передачи им соединения.

    На каждый экземпляр класса «очереди» или «обмена» открывается новый канал. Канал закрывается автоматически при вызове деструктора класса.

    По умолчанию осуществляется соединение с брокером на vhost=/ login=guest password=guest port=5672
    Параметры коннекции передаются в строке (connectionString) следующего вида: «password:login@host:port/vhost». Это вполне уже утвердившийся стандарт. Если какой-либо параметр отсутствует, то он замещается на параметр по умолчанию.

    Если отсутствует соединение, то можно распечатать параметры коннекции методом printConnect().

    AMQP amqp;
    amqp->printConnect();

    ./test
    connect
    port =5672
    host =localhost
    vhost=/
    user =guest
    passw=guest

    // коннекция на amqp-proxy-debug
    AMQP amqp(AMQPDEBUG);
    amqp->printConnect();

    ./test
    connect
    port =5673
    host =localhost
    vhost=/
    user =guest
    passw=guest

    // произвольная коннекция
    AMQP amqp("123123:akalend@10.0.0.2/private");
    ./test
    connect
    port =5672
    host =10.0.0.2
    vhost=private
    user =akalend
    passw=123123


    Обмен



    Экземпляр класса обмена AMQPExchange можно получить из класса AMQP методом createExchange()
    Данный метод может иметь или не иметь параметр — имя обмена. Чтоб избежать утечек — предлалается использовать auto_ptr

    AMQP amqp;
    auto_ptr<AMQPExchange> ex( amqp.createExchange("ex") );
    ex->Declare("e""topic");


    Для осуществления операций с Обменом — его надо объявить. Объявить обмен можно двумя способами: либо указать имя обмена при его создании, либо при объявлении:

    AMQP amqp;
    auto_ptr<AMQPExchange> ex( amqp.createExchange("ex") );
    ex->Declare();
    // 
    auto_ptr<AMQPExchange> ex( amqp.createExchange() );
    ex->Declare("e""topic");
     


    Второй параметр метода AMQPExchange::Declare() — тип обмена, строковое значение. Обмены могут быть трех типов:
    • Прямые direct — прямое совпадение по ключу
    • Тематические topic — совпадение по маски, ключ может быть составной.
    • fanout, без ключа

    По дефолту установлен тип обмена — прямой.

    Третий не обязательный параметр — это параметры Обмена. Параметры обмена — одна из констант:
    • AMQP_PASSIVE — пассивный
    • AMQP_AUTODELETE — автоудаление, если не используется
    • AMQP_DURABLE — durable, т.е. остается при перезагрузке брокера.


    Если нам не нужен обмен, то мы его можем удалить:

    AMQP amqp;
    auto_ptr<AMQPExchange> ex( amqp.createExchange("ex") );
    ex->Delete();
    //  or 
    auto_ptr<AMQPExchange> ex( amqp.createExchange() );
    ex->Delete("ex");
     


    Так же можно осуществить привязку (Bind) Обмена к Очереди. Привязка осуществляется по ключу. Для обмена fanout — указываем пустую строку, значение ключа игнорируется или не указываем ключ вообще. Если обмен в брокере уже существует, то его повторно можно не объявлять.
    AMQP amqp;
    auto_ptr<AMQPExchange> ex( amqp.createExchange("ex") );
    // обмен был объявлен ранее
    ex->Bind("queue_name","key_value");
     
    // объявление обмена типа fanout  и привязка его к очереди
    auto_ptr<AMQPExchange> ex2( amqp.createExchange() );
    ex2->Declare("ex2""fanout");
    ex2->Bind("queue_name2");
     

    Необходимо заметить, что Привязку можно делать как Очереди к Обмену, так и Обмена к Очереди.

    Публикация сообщений
    :
    Если обмен существует, то в него можно публиковать сообщения. Если есть привязанные к нему очереди, то эти сообщения направятся в соответствующие очереди. Каждое сообщение публикуется с соответствующим ключём, Если тип Обмена fanout, то устанавливается пустой ключ, который игнорируется:
    AMQP amqp;
    auto_ptr<AMQPExchange> ex( amqp.createExchange("ex") );
    // обмен был объявлен ранее
    ex->Publish("some message""key");
     


    PS…
    Об использовании «Очередей» в части 2

    Комментарии 2

      +1
      Очень советую взять в привычку описывать в начале статьи, ещё перед катом, о чём идёт речь.
      Нет, я понимаю что это враппер, но я не знаю что такое librabbitmq(хотя лично я слышал немного).

      Вот хорошо бы написать пару строк о том что такое librabbitmq.
      А сама статья хорошая, да. Чаще использовал бы C++ и системы очередей — добавил бы в закладки.
        0
        учту, поправлю.
        спасибо

      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

      Самое читаемое