Pull to refresh

Lib amqpcpp wrapper for librabbitmq

Reading time 4 min
Views 2.4K
За последние полтора года активно набирает популярность Сервер очередей 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:
Hubs:
+5
Comments 2
Comments Comments 2

Articles