自定义AllWindowFunction类成员

时间:2018-09-17 12:54:03

标签: java apache-flink

我有一个自定义AllWindowFunction类,该类具有负责数据库插入的类成员。与数据库的连接是持久的,并在构建期间打开。

问题是,创建/打开连接的AllWindowFunction实例与apply事件调用的实例不同。解决方法是静态成员,但是我想知道这是否是唯一的解决方法吗?

示例代码:

public class CustomWindowFunction implements AllWindowFunction<String, String, TimeWindow> {

    private static Connection database;

    CustomWindowFunction() {
        database = new Connection();
    }

    @Override
    public void apply(TimeWindow timeWindow, Iterable<String> trades, Collector<String> out) {
        // process data
        database.save(data);
        out.collect(data.toString());
    }
}

我找不到有关此机制的任何信息,我所知道的是,构造函数的对象ID与apply调用的对象ID不同。

1 个答案:

答案 0 :(得分:2)

之所以如此,是因为每个功能都必须序列化才能分布在群集的各个节点上。不过,您可以尝试使用RichAllWindowFunction,也就是所谓的“ Rich”版本,在此您拥有open()方法,该方法将在每个并行运算符的开始处调用。 在这种方法中,您可以创建连接

public class CustomWindowFunction implements RichAllWindowFunction<String, String, TimeWindow> {

    private Connection database;

    @Override
    public void open(Configuration parameters) {
        database = new Connection();
    }

    @Override
    public void apply(TimeWindow timeWindow, Iterable<String> trades, Collector<String> out) {
        // process data
        database.save(data);
        out.collect(data.toString());
    }
}