Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 等待Kafka Send API返回的ListenAbleFuture列表_Java_Future_Spring Kafka_Kafka Producer Api - Fatal编程技术网

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()
中。