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
方法实例是相同的。