【问题标题】:AMQP Message properties not being published to RabbitMQ hubAMQP 消息属性未发布到 RabbitMQ 集线器
【发布时间】:2021-02-18 09:34:03
【问题描述】:

我已经按照https://github.com/alanxz/rabbitmq-c 构建说明中的描述使用vcpkg 构建rabbitmq-c:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install librabbitmq
./vcpkg install boost

然后我构建了https://github.com/alanxz/SimpleAmqpClient(最新发布版本2.5.1)

我面临的问题是 CorrelationId、Type 等消息属性没有发送到 RabbitMq 集线器。在我升级到最新版本之前,相同的代码之前可以运行。

这是我正在使用的代码: 我使用以下代码发布消息:

void RabbitMqNode::SendResponse(google::protobuf::Message *response, NodeEnvelope *envelope, std::map<string, string> headers)
{
    auto message = GetBasicResponseMessage(response, envelope, &headers);
    auto returnAddress = envelope->returnAddress;
    channel->BasicPublish(std::string(), returnAddress, message);
}

AmqpClient::BasicMessage::ptr_t RabbitMqNode::GetBasicResponseMessage(google::protobuf::Message *response, NodeEnvelope * envelope, std::map<string, string>* headers)
{
    auto message = GetBasicMessage(response, headers);
    message->CorrelationId(envelope->corelationId);
    return message;
}

AmqpClient::BasicMessage::ptr_t RabbitMqNode::GetBasicMessage(google::protobuf::Message *inputMessage, std::map<string, string> *headers)
{
    auto body = serializer.SerializeMessageToJson(inputMessage);
    return GetBasicMessage(inputMessage, body, headers);
}

AmqpClient::BasicMessage::ptr_t RabbitMqNode::GetBasicMessage(google::protobuf::Message *inputMessage, std::string messageBody, std::map<string, string> *headers)
{
    auto name = GetMessageName(inputMessage);
    auto message = AmqpClient::BasicMessage::Create(messageBody);
    message->DeliveryMode(AmqpClient::BasicMessage::delivery_mode_t::dm_nonpersistent);
    message->ContentType(MIME_JSON);
    message->Type(name);
    message->AppId(nodeId);
    auto headerTable = message->HeaderTable();
    InitializeHeaders(&headerTable, headers);
    message->HeaderTable(headerTable);
    message->Timestamp(utility.GetCurrentUnixTimestampMilliseconds());

    return message;
}

void RabbitMqNode::InitializeHeaders(AmqpClient::Table *headersTable, std::map<string, string> *headers)
{
    if (headers->empty())
    {
        return;
    }
    std::map<string, string>::iterator it = headers->begin();
    while (it != headers->end())
    {
        auto key = (std::string)it->first;
        auto value = it->second;

        headersTable->insert(std::pair<string, string>(key, value));

        // Increment the Iterator to point to next entry
        it++;
    }
}

注意:邮件正文和标头正在发送,没有任何问题。

观察:如果我不初始化标头,则只有 AppId 属性被正确发送;但是如果我初始化标头,那么除了标头之外,没有其他属性被发送到集线器。正文始终正确发送;没问题。

谁能指出错误?

PS:我在 Git 存储库中为此创建了一个问题:https://github.com/alanxz/SimpleAmqpClient/issues/287

【问题讨论】:

    标签: rabbitmq rabbitmq-c


    【解决方案1】:

    问题已解决。最新版本(SimpleAmqpClient v2.5.1)有这个问题,但稍后会在主分支中修复。更多细节在这里:github.com/alanxz/SimpleAmqpClient/issues/287

    【讨论】:

      猜你喜欢
      • 2017-08-17
      • 1970-01-01
      • 1970-01-01
      • 2012-05-29
      • 1970-01-01
      • 2013-12-30
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多