我在无序模式下使用AsyncFunc时遇到无限循环。
可以使用以下代码再现
import org.apache.flink.streaming.api.datastream.AsyncDataStream;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.async.AsyncFunction;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
public class AsyncTest {
@Test
public void test() throws Exception {
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<Integer> withTimestamps = env.fromCollection(Arrays.asList(1,2,3,4,5));
AsyncDataStream.unorderedWait(withTimestamps,
(AsyncFunction<Integer, String>) (input, collector) -> {
if (input == 3){
collector.collect(new RuntimeException("Test"));
return;
}
collector.collect(Collections.singleton("Ok"));
}, 10, TimeUnit.MILLISECONDS)
.returns(String.class)
.print();
env.execute("unit-test");
}
}
我的猜测是 UnorderedStreamElementQueue 是无限循环的原因。
似乎将包含失败未来的 StreamElementQueueEntry 添加到其 firstSet 字段中,但从未将其删除(因为此失败的未来不会触发onCompleteHandler方法)。
任何人都知道这是否正确或者我的代码是否犯了错误?
答案 0 :(得分:1)
AsyncWaitOperator
确实存在错误。问题是它不会对异常结果(用户异常以及超时异常)做出反应。
在有序等待的情况下,这会导致只有在完成另一个异步结果时才会检测到异常结果(没有例外)。
如果是无序等待,则会导致StreamElementQueueEntry
永远不会从firstSet
移动到completedQueue
。
此问题有issue。希望在未来几天内得到解决。