Асинхронный вызов не работает с Callback () в коде - PullRequest
0 голосов
/ 01 февраля 2019

асинхронный вызов не работает с 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. Брокер может быть недоступен."

, но яЯ надеюсь, что из-за вызова Asynchronus он не должен ждать до истечения времени ожидания, а выполнить logger.info("ACEEVNTMNGR: i am not waiting for the return"); до того, как истечет время ожидания.

1 Ответ

0 голосов
/ 02 февраля 2019

KafkaProducer:send возвращает Future<RecordMetadata>, но не вся работа, выполняемая функцией send, переносится в Future.

Перед отправкой сообщения должны быть доступны метаданные (при первой отправке они должны быть получены).Если метаданные недоступны или не могут быть получены, send будет длиться не менее max.block.ms.По умолчанию это 60000 мс.

В вашем примере вы должны увидеть: ACEEVNTMNGR: i am not waiting for the return через 60 секунд.

...