异步调用不适用于代码中的Callback()

时间:2019-02-01 13:57:02

标签: callback apache-kafka kafka-producer-api

异步调用不能与Callback()一起使用,程序等待send()完成,并且不会立即执行下一行。 在代码中,

ProducerRecord<Long, String> record = new ProducerRecord<Long, String>(TOPIC, text);
...
    producer.send(record,new Callback() {

        @Override
        public void onCompletion(RecordMetadata metadata, Exception exception) {
            logger.info("sent to kafka");
        }
    });
    logger.info("ACEEVNTMNGR: i am not waiting for the return");
...

该代码不执行下一行,而是仅在连接超时并显示“已发送到kafka”后才执行。其实连接kafka并出现错误是有问题的:

  

“无法建立与节点-1的连接。   可用。”

但是我希望由于异步调用,它不应该等到timeout超时,而是执行 logger.info("ACEEVNTMNGR: i am not waiting for the return"); 在超时发生之前。

1 个答案:

答案 0 :(得分:0)

KafkaProducer:send返回Future<RecordMetadata>,但不是send函数执行的所有工作都包装在Future中。

在发送消息元数据之前必须可用(首先发送时必须提取它们)。 如果元数据不可用或无法提取,则send的持续时间至少为max.block.ms。默认情况下为60000ms。

在您的示例中,您应该在60秒后看到:ACEEVNTMNGR: i am not waiting for the return