问题
I have the List of ListenAbleFuture.I want to wait of this List of
ListenableFuture<SendResult<Integer, String>> for atmost 15 minutes if they have not comepleted.
How can i achieve it.
Currently i am doing this but this wait for 15 min for every ListenAbleFuture which is what i dont want.
for (ListenableFuture<SendResult<Integer, String>> m : myFutureList) {
m.get(15, TimeUnit.MINUTES) ;
}
ListenableFuture<SendResult<Integer, String>> is from import org.springframework.util.concurrent.ListenableFuture;
I have gone through Waiting on a list of Future but this solution is for completablefuture
回答1:
Create a CountDownLatch, e.g. new CountDownLatch(50), add a listener to each listenable future and count the latch down in each one. You can use the same listener for all the futures rather than creating a new one each time.
Then, after sending 50 records, use latch.await(10, TimeUnit.SECONDS). If it times out you can then iterate over your futures to figure out which one(s) are not complete.
EDIT
@Component
class Sender {
private static final Logger LOG = LoggerFactory.getLogger(Sender.class);
public void sendThem(KafkaTemplate<String, String> template, List<String> toSend) throws InterruptedException {
List<ListenableFuture<SendResult<String, String>>> futures = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(toSend.size());
ListenableFutureCallback<SendResult<String, String>> callback =
new ListenableFutureCallback<SendResult<String, String>>() {
@Override
public void onSuccess(SendResult<String, String> result) {
LOG.info(result.getRecordMetadata().toString());
latch.countDown();
}
@Override
public void onFailure(Throwable ex) {
ProducerRecord<?, ?> producerRecord = ((KafkaProducerException) ex).getProducerRecord();
LOG.error("Failed; " + producerRecord, ex);
latch.countDown();
}
};
toSend.forEach(str -> {
ListenableFuture<SendResult<String, String>> future = template.send("so61490633", str);
future.addCallback(callback);
});
if (latch.await(10, TimeUnit.SECONDS)) {
LOG.info("All sent ok");
}
else {
for (int i = 0; i < toSend.size(); i++) {
if (!futures.get(i).isDone()) {
LOG.error("No send result for " + toSend.get(i));
}
}
}
}
}
来源:https://stackoverflow.com/questions/61490633/wait-for-list-of-listenablefuture-returned-by-kafka-send-api