无法在Custom DataSink上初始化Field(Flink CEP)

时间:2017-08-24 08:58:23

标签: java-8 apache-flink flink-streaming flink-cep

我遇到了Apache Flink Streaming API的问题。

我可以设法使用自定义DataSource设置整个CEP-Environment,当在该源上使用标准接收器(如“print()”)时,一切正常。

这就是我的水槽现在的样子:

@RequiredArgsConstructor
public class EventDataConsumer extends RichSinkFunction<EventData>{

private final transient Consumer<EventData> consumer;

    @Override
    public void invoke(EventData eventData) throws Exception {
        consumer.accept(eventData);
    }
}

我试图实现的目的是传递一个方法引用到这个SinkFunction,它应该为我的DataStream中的每个元素执行。

这是我初始化SinkFunction的方法:

EventDataConsumer consumer = new EventDataConsumer(someService::handleEventData);
outStream.addSink(consumer);

我的问题是,当我在自定义接收器的“invoke”方法中设置断点时,即使我明确调用构造函数,消费者看起来也是null,这会分配消费者。

1 个答案:

答案 0 :(得分:1)

由于Sink被分配给与接收器的并行性一样多的实例,因此它应该是可序列化的。在群集上执行时,Sink被序列化,发送到TaskManagers进行反序列化。

在您的示例中,consumer字段为transient,这就是为什么在序列化后它变为null