AMQP-CPP RabbitMQ потребитель, основанный на асинхронных событиях, ничего не потребляющий

Я использую библиотеку AMQ-CPP (https://github.com/CopernicaMarketingSoftware/AMQP-CPP) для подключения к существующей очереди, которую я создал, но я не могу ничего прочитать. Я проверил, что очередь работает с использованием другой библиотеки (https://github.com/alanxz/SimpleAmqpClient, это работает, и я потребляю сообщения), но это использует подход опроса, и мне нужен основанный на событии один.

Мой код выглядит так (на основе предоставленного примера):

int main()
{
auto *poll = EV_DEFAULT;

// handler for libev (so we don't have to implement AMQP::TcpHandler!)
AMQP::LibEvHandler handler(poll);

// make a connection
AMQP::TcpConnection connection(&handler, AMQP::Address("amqp://localhost/"));

// we need a channel too
AMQP::TcpChannel channel(&connection);

// Define callbacks and start
auto messageCb = [&channel](
const AMQP::Message &message, uint64_t deliveryTag,
bool redelivered)
{
std::cout << "message received" << std::endl;
// acknowledge the message
channel.ack(deliveryTag);
processMessage(message.routingKey(), message.body());
};

// callback function that is called when the consume operation starts
auto startCb = [](const std::string &consumertag) {

std::cout << "consume operation started: " << consumertag << std::endl;
};

// callback function that is called when the consume operation failed
auto errorCb = [](const char *message) {

std::cout << "consume operation failed" << std::endl;
};

channel.consume("domoqueue")
.onReceived(messageCb)
.onSuccess(startCb)
.onError(errorCb);

// run the poll
ev_run(poll, 0);

// done
return 0;
}

Я запускаю код в Raspberry Pi, имеющий:

Linux raspberrypi 4.4.26-v7+ #915 SMP Thu Oct 20 17:08:44 BST 2016 armv7l GNU/Linux

В чем может быть проблема? Возможно, мне не хватает некоторых параметров конфигурации для очереди … Я поместил несколько трасс отладки, и создание канала не происходит. Блокирует в операторе соединения:

AMQP::TcpConnection connection(&handler, AMQP::Address("amqp://localhost/"));
cout << "I never show up" << endl;

// we need a channel too
AMQP::TcpChannel channel(&connection)

1

Решение

Я нашел мою проблему: я не использовал метод DeclareQueue ()! На самом деле мне пришлось использовать его, но указав следующие параметры (так же, как и при создании очереди вручную):

AMQP::Table arguments;
arguments["x-message-ttl"] = 120 * 1000;

// declare the queue
channel.declareQueue("domoqueue", AMQP::durable + AMQP::passive, arguments).onSuccess(callback);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]