Java OrderedStreamlementQueue-潜在死锁

Java OrderedStreamlementQueue-潜在死锁,java,asynchronous,apache-flink,Java,Asynchronous,Apache Flink,在有序模式下使用AsyncFunc时,我似乎陷入了死锁 我已经能够复制此错误,如下所示: import org.apache.flink.streaming.api.datastream.AsyncDataStream; 导入org.apache.flink.streaming.api.datastream.datastream; 导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment; 导入org.apac

在有序模式下使用AsyncFunc时,我似乎陷入了死锁

我已经能够复制此错误,如下所示:

import org.apache.flink.streaming.api.datastream.AsyncDataStream;
导入org.apache.flink.streaming.api.datastream.datastream;
导入org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
导入org.apache.flink.streaming.api.functions.async.AsyncFunction;
导入org.apache.flink.streaming.api.functions.async.collector.AsyncCollector;
导入org.junit.Test;
导入java.util.array;
导入java.util.Collections;
导入java.util.concurrent.CompletableFuture;
导入java.util.concurrent.ScheduledThreadPoolExecutor;
导入java.util.concurrent.TimeUnit;
公共类异步测试{
@试验
public void test()引发异常{
StreamExecutionEnvironment env=StreamExecutionEnvironment.getExecutionEnvironment();
环境(一);
datastreamsource=env.fromCollection(Arrays.asList(1,2,3,4,5,6,7));
AsyncDataStream.orderedWait(源、,
新的异步函数(){
@凌驾
public void asyncInvoke(整型整型,AsyncCollector AsyncCollector)引发异常{
AsyncTest.getFuture(整数).whenComplete((t,m)->{
如果(m==null){
asyncCollector.collect(Collections.singleton(t));
返回;
}
asyncCollector.collect(m);
});
}
},20000,时间单位。毫秒,5)
.returns(String.class)
.print();
环境执行(“单元测试”);
}
静态CompletableFuture getFuture(整数输入){
返回CompletableFuture.SupplySync(()->{
试一试{
睡眠(10000);
}捕捉(中断异常e){
}
如果(输入=7){
系统输出打印项次(“返回”);
返回“ok”;
}
System.out.println(“唤醒”);
抛出新的运行时异常(“测试”);
},新的ScheduledThreadPoolExecutor(10));
}
}
我认为这种僵局可能来自这样一个事实,即OrderedStreamlementQueue的基础ArrayQueue首先充满了不完整的未来

发射器尝试从此队列中窥视时,由于没有未来完成,发射器暂停其执行

当期货完成时,它们异常完成,因此不会触发本应在头上调用signalAll的onCompleteHandler方法(从而唤醒发射器线程)

同时,由于队列已满,对OrderedStreamElementtryPut的任何调用都返回false,因此没有StreamElementQueueEntry可以与对onCompleteHandler的调用链接

因此,似乎无法唤醒发射器线程

这只是我的猜测。也许我弄错了。但是当我在本地运行上面的代码时,执行永远不会结束


除了增加队列的容量和/或作业的并行性之外,还有什么方法可以克服这个问题吗

你的分析是正确的。问题在于
streamlementqueueentry
对其未来的异常完成没有反应。因此,每当发生超时或其他异常时,
streamlementqueueentry
未正确设置为completed,并且未通知发射器有关新完成的条目

该问题已修复,并已与Flink master合并