На основе этой библиотеке выложил в 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

