У меня есть следующий клиент 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'
Знаете ли вы, как правильно перенести этот код?




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) {
...
}
Да. Да. Да...
Мне нужно задать еще один вопрос: stackoverflow.com/questions/78316505/… Код выше используется для второго вопроса. Но по какой-то причине я получаю ошибку.
По поводу этого комментария It is a bit cumbersome, so I suggest defining this: Можете ли вы немного расширить ответ, пожалуйста?
Мне нужно использовать
import java.util.function.BiConsumer;?