Невозможно разрешить метод addCallback в CompletableFuture

У меня есть следующий клиент Kafka, который я хочу перенести на Spring Boot 3:

@Service
public class KafkaProducer<K, V> {
  
  private final KafkaTemplate<K, V> kafkaTemplate;

  public KafkaProducer(KafkaTemplate<K, V> kafkaTemplate) {
    this.kafkaTemplate = kafkaTemplate;
  }

  public void send(String topic, K key, V message, ListenableFutureCallback callback) {
    ListenableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
    if (Objects.nonNull(callback)) {
      future.addCallback(callback);
    }
  }
}

Я получаю сообщение об ошибке:

Required type: ListenableFuture <SendResult<K, V>> 
Provided: CompletableFuture <SendResult<K, V>>

Я изменил код на:

CompletableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
    if (Objects.nonNull(callback)) {
      future.addCallback(callback);
    }

Но теперь я получаю:

Cannot resolve method 'addCallback' in 'CompletableFuture'

Знаете ли вы, как правильно перенести этот код?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

JavaDoc ListenableFutureCallback понятен:

Устарело.

начиная с версии 6.0, в пользу CompletableFuture.whenComplete(BiConsumer)

public void send(String topic, K key, V message, BiConsumer<SendResult<K, V>, Throwable> callback) {
    CompletableFuture<SendResult<K, V>> future = kafkaTemplate.send(topic, key, message);
    if (Objects.nonNull(callback)) {
        future.whenComplete(callback);
    }
}

Это немного громоздко, поэтому я предлагаю определить это:

public interface Callback<K, V> extends BiConsumer<SendResult<K, V>, Throwable> {
}
public void send(String topic, K key, V message, Callback<K, V> callback) {
...
}

Мне нужно использовать import java.util.function.BiConsumer;?

Peter Penzov 12.04.2024 16:37

Да. Да. Да...

Nikolas Charalambidis 12.04.2024 19:25

Мне нужно задать еще один вопрос: stackoverflow.com/questions/78316505/… Код выше используется для второго вопроса. Но по какой-то причине я получаю ошибку.

Peter Penzov 12.04.2024 21:09

По поводу этого комментария It is a bit cumbersome, so I suggest defining this: Можете ли вы немного расширить ответ, пожалуйста?

Peter Penzov 12.04.2024 22:14

Другие вопросы по теме