Вероятность того, что обратный вызов не будет зарегистрирован для метода отправки Springkafka-шаблона - PullRequest
0 голосов
/ 30 января 2019

Я хочу зарегистрировать обратный вызов для будущего объекта, возвращенного из пружины kafkatemplate.send().

ListenableFuture<SendResult<K, V>> org.springframework.kafka.core.KafkaTemplate.send(String topic, K key, V data)

Я вызываю метод ниже для будущего результата вышеупомянутого метода.

void org.springframework.util.concurrent.ListenableFuture.addCallback(ListenableFutureCallback<? super T> callback)

вот так:

kafkaTemplate.send(topicname, keyString, data).addCallback(
    new ListenableFutureCallback<SendResult<String, Data>>() {
        @Override
        public void onFailure(Throwable ex) {
            logger.error("Failure while sending message in kafka.", ex);
        }

        @Override
        public void onSuccess(SendResult<String, Data> result) {
            logger.info("Successfully sent message to kafka");
        }

    });

Предположим, если send() завершит фактическую отправку очень быстро, и результат уже будет установлен в будущем до того, как я зарегистрирую обратный вызов.Моя регистрация обратного вызова произойдет после операции future.set().Таким образом, есть вероятность, что мой обратный вызов не будет выполнен.Разве это не возможно?

Я знаю, что такая возможность намного меньше.Тем не менее, это может случиться?Если так, то каково решение.

1 Ответ

0 голосов
/ 30 января 2019

Нет, будущее решает эту проблему путем немедленного вызова обратного вызова после добавления его, если оно уже выполнено - посмотрите исходный код SettableListenableCallback.addCallback().

...