AsyncFunction - 在无序模式下收集throwable的错误

时间:2017-04-26 16:29:51

标签: apache-flink

我在无序模式下使用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方法)。

任何人都知道这是否正确或者我的代码是否犯了错误?

1 个答案:

答案 0 :(得分:1)

AsyncWaitOperator确实存在错误。问题是它不会对异常结果(用户异常以及超时异常)做出反应。

在有序等待的情况下,这会导致只有在完成另一个异步结果时才会检测到异常结果(没有例外)。

如果是无序等待,则会导致StreamElementQueueEntry永远不会从firstSet移动到completedQueue

此问题有issue。希望在未来几天内得到解决。