Java 等待Kafka Send API返回的ListenAbleFuture列表
我有未来的列表。我想等待这个列表Java 等待Kafka Send API返回的ListenAbleFuture列表,java,future,spring-kafka,kafka-producer-api,Java,Future,Spring Kafka,Kafka Producer Api,我有未来的列表。我想等待这个列表 ListenableFuture,如果尚未完成,则至少15分钟。 我怎样才能做到这一点 目前我正在做这件事,但是每听一个未来都要等15分钟,这是我不想要的 for (ListenableFuture<SendResult<Integer, String>> m : myFutureList) { m.get(15, TimeUnit.MINUTES) ; } ListenableFut
ListenableFuture
,如果尚未完成,则至少15分钟。
我怎样才能做到这一点
目前我正在做这件事,但是每听一个未来都要等15分钟,这是我不想要的
for (ListenableFuture<SendResult<Integer, String>> m : myFutureList) {
m.get(15, TimeUnit.MINUTES) ;
}
ListenableFuture<SendResult<Integer, String>> is from import org.springframework.util.concurrent.ListenableFuture;
for(ListenableFuture m:myFutureList){
m、 get(15,时间单位:分钟);
}
ListenableFuture来自导入org.springframework.util.concurrent.ListenableFuture;
我已经看过了,但是这个解决方案是针对completablefuture的创建一个
倒计时闩锁
,例如新建倒计时闩锁(50)
,为每个可列出的未来添加一个侦听器,并在每个可列出的未来中倒计时。您可以对所有未来使用相同的侦听器,而不是每次都创建一个新的侦听器
然后,在发送50条记录后,使用slack.wait(10,TimeUnit.SECONDS)
。如果它超时了,你可以迭代你的未来,找出哪一个(一个)是不完整的
编辑
@组件
类发送器{
私有静态最终记录器LOG=LoggerFactory.getLogger(Sender.class);
public void sendthes(KafkaTemplate模板,List toSend)抛出InterruptedException{
列表期货=新的ArrayList();
CountDownLatch latch=新的CountDownLatch(toSend.size());
ListenableFutureCallback回调=
新建ListenableFutureCallback(){
@凌驾
成功时公共无效(SendResult结果){
LOG.info(result.getRecordMetadata().toString());
倒计时();
}
@凌驾
失效时的公共无效(可丢弃的ex){
ProducerRecord ProducerRecord=((KafkaProducerException)ex).getProducerRecord();
日志错误(“失败;”+生产记录,ex);
倒计时();
}
};
toSend.forEach(str->{
ListenableFuture=template.send(“so61490633”,str);
future.addCallback(callback);
});
if(锁存等待(10,时间单位秒)){
日志信息(“全部发送正常”);
}
否则{
对于(int i=0;i
我在回答中添加了一个示例。谢谢。我正在尝试理解代码,因为我不太擅长异步编程。在您的代码中,我需要访问哪些消息没有在onFailure()中发送给kafka方法。我为循环中的每条记录添加了一个侦听器。我的问题就解决了。只是问我应该这样做还是有更好的方法。但是,如果我按照pastebin链接Countdownlatch中给出的方式更改代码,则该代码将无法正常工作。它只等待一个未来。我如何在代码中修复该问题?失败的发送值可在可丢弃文件中找到
-将其转换为KafkaProducerException
-我更新了答案。您的人员
位于producerRecord.value()
中。