amqp_basic_qos没有任何作用

时间:2019-01-26 06:06:04

标签: rabbitmq qos rabbitmq-c librabbitmq

我正在尝试使用librabbitmq编写一个简单的使用者。它正在工作,但是当我执行amqp_basic_consume时,它将消耗整个队列。 我想要的是让它收到一条消息,对其进行处理并重复。

我尝试使用basic_qos一次使消费者预取1,但这似乎根本没有效果。

基本设置和循环:     //一次设置1条消息的质量     如果(!amqp_basic_qos(conn,channel,0,1,0)){         die_on_amqp_error(amqp_get_rpc_reply(conn),“ basic.qos”);     }

// Consuming the message
amqp_basic_consume(conn, channel, queue, amqp_empty_bytes, no_local, no_ack, exclusive, amqp_empty_table);

while (run) {
    amqp_rpc_reply_t result;
    amqp_envelope_t envelope;

    amqp_maybe_release_buffers(conn);
    result = amqp_consume_message(conn, &envelope, &timeout, 0);

    if (AMQP_RESPONSE_NORMAL == result.reply_type) {

        strncpy(message, envelope.message.body.bytes, envelope.message.body.len);
        message[envelope.message.body.len] = '\0';

        printf("Received message size: %d\nbody: -%s-\n", (int) envelope.message.body.len, message );

        if ( strncmp(message, "DONE",4 ) == 0 )
        {
            printf("XXXXXXXXXXXXXXXXXX Cease message received. XXXXXXXXXXXXXXXXXXXXX\n");
            run = 0;
        }
        amqp_destroy_envelope(&envelope);
    }else{
         printf("Timeout.\n");
         run = 0;
    }
}

我希望可以开始处理的队列已满,如果我按^ C,则其余消息仍在队列中。相反,即使我只处理了一条消息,整个队列也会被清空。

1 个答案:

答案 0 :(得分:0)

这是noAck为true时的行为。将会发生的事情是,消息将以代理可以发送的最快速度推送到连接的消费者,因为它假定消费者能够接受它们,因为它们在传递后立即被确认。 < / p>

在这种情况下,您想将noAck更改为false,然后将ack的每条消息明确地返回给代理。

或者,您可以一次使用basic.get从经纪人处提取一条消息,而不是使用基于推送的使用者(那里有些人不喜欢这种想法)。您的用例将确定最合适的用例,但是基于您似乎队列已满且消息相当密集的事实,我认为在这种情况下,basic.get就可以了。然后的问题是决定在队列为空时轮询的频率。