Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java flink SourceFunction<&燃气轮机;正在StreamExecutionEnvironment.addSource()中替换?_Java_Apache Flink_Flink Streaming_Complex Event Processing_Flink Cep - Fatal编程技术网

Java flink SourceFunction<&燃气轮机;正在StreamExecutionEnvironment.addSource()中替换?

Java flink SourceFunction<&燃气轮机;正在StreamExecutionEnvironment.addSource()中替换?,java,apache-flink,flink-streaming,complex-event-processing,flink-cep,Java,Apache Flink,Flink Streaming,Complex Event Processing,Flink Cep,我在尝试创建自定义事件源时遇到了这个问题。它包含一个队列,允许我的其他进程向其中添加项目。然后期望我的CEP模式在匹配时打印一些调试消息 但无论我在队列中添加什么,都没有匹配项。然后我注意到mySource.run()中的队列总是空的。这意味着我用来创建mySource实例的队列与StreamExecutionEnvironment中的队列不同。如果我将队列更改为静态,强制所有实例共享同一队列,那么一切都会按预期工作 DummySource.java public class Dummy

我在尝试创建自定义事件源时遇到了这个问题。它包含一个队列,允许我的其他进程向其中添加项目。然后期望我的CEP模式在匹配时打印一些调试消息

但无论我在队列中添加什么,都没有匹配项。然后我注意到mySource.run()中的队列总是空的。这意味着我用来创建mySource实例的队列与
StreamExecutionEnvironment
中的队列不同。如果我将队列更改为静态,强制所有实例共享同一队列,那么一切都会按预期工作

DummySource.java

    public class DummySource implements SourceFunction<String> {

    private static final long serialVersionUID = 3978123556403297086L;
//  private static Queue<String> queue = new LinkedBlockingQueue<String>();
    private Queue<String> queue;
    private boolean cancel = false;

    public void setQueue(Queue<String> q){
        queue = q;
    }   

    @Override
    public void run(org.apache.flink.streaming.api.functions.source.SourceFunction.SourceContext<String> ctx)
            throws Exception {
        System.out.println("run");
        synchronized (queue) {          
            while (!cancel) {
                if (queue.peek() != null) {
                    String e = queue.poll();
                    if (e.equals("exit")) {
                        cancel();
                    }
                    System.out.println("collect "+e);
                    ctx.collectWithTimestamp(e, System.currentTimeMillis());
                }
            }
        }
    }

    @Override
    public void cancel() {
        System.out.println("canceled");
        cancel = true;
    }
}
公共类DummySource实现SourceFunction{
私有静态最终长serialVersionUID=3978123556403297086L;
//private static Queue Queue=new LinkedBlockingQueue();
专用队列;
私有布尔取消=false;
公共无效集合队列(队列q){
队列=q;
}   
@凌驾
public void运行(org.apache.flink.streaming.api.functions.source.SourceFunction.SourceContext ctx)
抛出异常{
System.out.println(“运行”);
已同步(队列){
而(!取消){
if(queue.peek()!=null){
字符串e=queue.poll();
如果(e.等于(“退出”)){
取消();
}
系统输出打印项次(“收集”+e);
ctx.collectWithTimestamp(e,System.currentTimeMillis());
}
}
}
}
@凌驾
公开作废取消(){
系统输出打印项次(“取消”);
取消=真;
}
}
因此,我深入研究了
StreamExecutionEnvironment
的源代码。在addSource()方法中。有一个clean()方法,它似乎将实例替换为新实例

返回给定函数的“closure cleaned”版本

为什么呢?为什么需要序列化? 我还尝试使用getConfig()关闭clean闭包。结果仍然是一样的。我的队列实例与env使用的队列实例不同

如何解决此问题?

Flink中函数使用的
clean()
方法主要是为了确保
函数(如SourceFunction、MapFunction)可序列化。Flink将序列化这些函数,并将它们分发到任务节点以执行它们


对于Flink主代码中的简单变量,如int,您可以在函数中简单地引用它们。但对于大的或不可序列化的,最好使用广播和丰富的源函数。请参阅

我的flink程序不是并行的。但广播变量确实解决了我的问题。parallel是指我使用stream.keyBy(“”)时的意思吗?每个键都会有自己的任务节点?可能您在这里提到的并行意味着在集群中运行。无论您在独立模式(在具有主节点和任务节点的本地计算机上运行)或群集模式(Flink群集或纱线群集)下如何运行Flink作业,Flink始终序列化
函数
,分发它们并在任务中执行它们。再次阅读文档后,看起来广播与数据集一起使用,在将任务发送到节点之前,需要知道广播变量。我可能需要查看TaskManager以了解更复杂的场景。