【问题标题】:AMQP-CPP beginner problemsAMQP-CPP 初学者问题
【发布时间】:2020-11-16 18:02:06
【问题描述】:

我是 rabbitmq 的新手,并尝试让一个侦听器从消息队列中读取。服务器应该没问题(不是我实现的,我猜是用 Java 实现的)。我为消费者使用 C++,并使用 amqpcpp 库。

这是我到目前为止所尝试的:

    int main(int argc, char* const argv[])
{
  // access to the boost asio handler
    // note: we suggest use of 2 threads - normally one is fin (we are simply demonstrating thread safety).
    boost::asio::io_service service(2);

    // handler for libev
    AMQP::LibBoostAsioHandler handler(service);
    
    // make a connection
    AMQP::Address address("amqp://10.40.216.87");
    AMQP::TcpConnection connection(&handler, address);

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


    //channel.onError(errorTCP);

    channel.declareQueue("logmessages");

   // 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:" << *message << std::endl;
    };

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

    
    // create a temporary queue
    /*channel.declareQueue(AMQP::exclusive).onSuccess([&connection](const std::string &name, uint32_t messagecount, uint32_t consumercount) {
        
        // report the name of the temporary queue
        std::cout << "declared queue " << name << std::endl;
        
        // now we can close the connection
        connection.close();
    });*/

    channel.consume("devices.state.*");
    
    // run the handler
    // a t the moment, one will need SIGINT to stop.  In time, should add signal handling through boost API.
    return service.run();
}

我总是收到“消费操作失败”。现在的问题是为什么......有没有办法获得更多的错误信息? (例如无法连接 TCP 套接字、找不到正确名称的队列等)。

感谢您的提示!

【问题讨论】:

    标签: c++ rabbitmq amqp


    【解决方案1】:

    在您的代码中,您试图计算 *message 指针而不是消息本身。

    而不是,

    auto errorCb = [](const char* message) {
        std::cout << "consume operation failed:" << *message << std::endl;
    };
    

    应该是,

    auto errorCb = [](const char* message) {
        std::cout << "consume operation failed:" << message << std::endl;
    };
    

    这应该会给你正确的错误信息。 请查看official repo 中的文档/示例。

    【讨论】:

      猜你喜欢
      • 2020-01-04
      • 2020-11-23
      • 2015-03-16
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多