Java 自定义AllWindowFunction类成员
我有一个自定义的Java 自定义AllWindowFunction类成员,java,apache-flink,Java,Apache Flink,我有一个自定义的AllWindowFunction类,它有一个负责数据库插入的类成员。与数据库的连接是持久的,并在构建过程中打开 问题是,创建/打开连接的AllWindowFunction实例与在应用事件中调用的实例不同。这是一个静态成员的解决方案,但我想知道这是否是唯一的解决方案 示例代码: public class CustomWindowFunction implements AllWindowFunction<String, String, TimeWindow> {
AllWindowFunction
类,它有一个负责数据库插入的类成员。与数据库的连接是持久的,并在构建过程中打开
问题是,创建/打开连接的AllWindowFunction
实例与在应用事件中调用的实例不同。这是一个静态成员的解决方案,但我想知道这是否是唯一的解决方案
示例代码:
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());
}
}
公共类CustomWindowFunction实现所有WindowFunction{
专用静态连接数据库;
CustomWindowFunction(){
数据库=新连接();
}
@凌驾
公开作废申请(时间窗口、可交易、收款人退出){
//过程数据
数据库。保存(数据);
out.collect(data.toString());
}
}
我找不到关于这个机制的任何信息,我只知道构造函数中的对象ID与从
apply
调用的对象ID不同 之所以如此,是因为每个函数都必须序列化才能分布在集群的节点上。不过,您可以尝试使用RichAllWindowFunction
,这就是所谓的“富”版本,其中有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());
}
}
public类CustomWindowFunction实现RichAllWindowFunction{
专用连接数据库;
@凌驾
公共无效打开(配置参数){
数据库=新连接();
}
@凌驾
公开作废申请(时间窗口、可交易、收款人退出){
//过程数据
数据库。保存(数据);
out.collect(data.toString());
}
}
之所以如此,是因为每个函数都必须序列化才能分布在集群的节点上。不过,您可以尝试使用RichAllWindowFunction
,这就是所谓的“富”版本,其中有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());
}
}
public类CustomWindowFunction实现RichAllWindowFunction{
专用连接数据库;
@凌驾
公共无效打开(配置参数){
数据库=新连接();
}
@凌驾
公开作废申请(时间窗口、可交易、收款人退出){
//过程数据
数据库。保存(数据);
out.collect(data.toString());
}
}
我认为这是可行的。为什么“富”版本支持“单例”类成员而“普通”不支持?任何如何将配置
传递给打开
方法调用的示例?它不支持“单例”成员。契约是在每个并行任务中框架将调用一次open
。那么,当在apply
函数中使用连接实例时,是什么使连接实例相同呢?您对“singleton”的理解是什么。Singleton通常意味着一种模式,其中对象的实例在每个类中创建一次,并在该类的所有实例中共享。从这个意义上讲,连接
不是一个单例。是的,某种程度上是错误的表达(这就是为什么使用引号)。正如问题中所解释的,如果我在AllWindowFunction
构造函数中实例化连接
,那么应用
中使用的连接
实例就不一样了。在RichAllWindowFunction
的情况下,在apply
中使用open
方法实例是相同的。我认为它是有效的。为什么“富”版本支持“单例”类成员而“普通”不支持?任何如何将配置
传递给打开
方法调用的示例?它不支持“单例”成员。契约是在每个并行任务中框架将调用一次open
。那么,当在apply
函数中使用连接实例时,是什么使连接实例相同呢?您对“singleton”的理解是什么。Singleton通常意味着一种模式,其中对象的实例在每个类中创建一次,并在该类的所有实例中共享。从这个意义上讲,连接
不是一个单例。是的,某种程度上是错误的表达(这就是为什么使用引号)。正如问题中所解释的,如果我在AllWindowFunction
构造函数中实例化连接
,那么应用
中使用的连接
实例就不一样了。在RichAllWindowFunction
的情况下,在apply
中使用open
方法实例是相同的。