异步调用不使用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的连接。经纪人可能不在。”
但是我希望由于异步调用,它不应该等到超时,而是执行 logger.info("ACEEVNTMNGR: i am not waiting for the return");
在超时发生之前。
1条答案
按热度按时间bwitn5fc1#
KafkaProducer:send
退货Future<RecordMetadata>
,但不是所有由send
函数,被 Package 到Future
.在发送消息之前,元数据必须可用(在第一次发送时,必须获取元数据)。如果元数据不可用或无法获取
send
至少会持续一段时间max.block.ms
. 默认为60000ms。在您的示例中,您应该看到:
ACEEVNTMNGR: i am not waiting for the return
60秒后。