我有一个自定义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不同。
答案 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());
}
}