21 April 2010

Lib amqpcpp wrapper for librabbitmq

Website development
За последние полтора года активно набирает популярность Сервер очередей 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
Tags:amqpc++rabbitmqmessage queue
Hubs: Website development
+5
1.6k 2
Comments 2