Java ApacheNIFI:同时输出到多个流文件?

Java ApacheNIFI:同时输出到多个流文件?,java,apache-nifi,Java,Apache Nifi,在NiFi中,有没有一种方法可以同时写入自定义处理器中的不同流?例如,我有第三方库,它们使用API进行重要的处理,API的工作方式如下: public void process(InputStream in, OutputStream foo, OutputStream baa, List<String> args) { ... foo.write(things); baa.write(stuff); ... } FlowFile f

在NiFi中,有没有一种方法可以同时写入自定义处理器中的不同流?例如,我有第三方库,它们使用API进行重要的处理,API的工作方式如下:

public void process(InputStream in, OutputStream foo, OutputStream baa, List<String> args)
{
    ...
    foo.write(things);
    baa.write(stuff);
    ...
}
        FlowFile flowFile1 = session.create();
        final AtomicReference<FlowFile> holder = new AtomicReference<>(session.create());

        flowFile1 = session.write(flowFile1, new OutputStreamCallback() {
            @Override
            public void process(OutputStream out) throws IOException {

                FlowFile flowFile2 = session.write(holder.get(), new OutputStreamCallback() {
                    @Override
                    public void process(OutputStream out) throws IOException {

                    }
                });
                holder.set(flowFile2);

            }
        });
处理是分批完成的(由于其规模很大),因此执行所有处理然后写出单独的流程是不实际的

我能想到的唯一方法是多次处理输入:(


为了澄清,我想使用
session.write(flowfile,callback)
方法写入多个流文件,这样就可以分别发送/管理不同的流

NiFi API基于一次处理一个流文件,但您应该能够执行以下操作:

public void process(InputStream in, OutputStream foo, OutputStream baa, List<String> args)
{
    ...
    foo.write(things);
    baa.write(stuff);
    ...
}
        FlowFile flowFile1 = session.create();
        final AtomicReference<FlowFile> holder = new AtomicReference<>(session.create());

        flowFile1 = session.write(flowFile1, new OutputStreamCallback() {
            @Override
            public void process(OutputStream out) throws IOException {

                FlowFile flowFile2 = session.write(holder.get(), new OutputStreamCallback() {
                    @Override
                    public void process(OutputStream out) throws IOException {

                    }
                });
                holder.set(flowFile2);

            }
        });
FlowFile-flowFile1=session.create();
最终AtomicReference持有者=新的AtomicReference(session.create());
flowFile1=session.write(flowFile1,新的OutputStreamCallback(){
@凌驾
公共无效进程(OutputStream out)引发IOException{
FlowFile flowFile2=session.write(holder.get(),new OutputStreamCallback()){
@凌驾
公共无效进程(OutputStream out)引发IOException{
}
});
支架组(flowFile2);
}
});

因为你从同一个输入中做出不同的输出,你也可以考虑将这些步骤分解为专注于执行其特定功能的离散处理器。例如,我建议您使用一个“DoThings”和“DoStuff”处理器。在您的流中,您可以通过两次源连接将同一个流文件发送给这两个处理器。这样就可以实现很好的并行操作,并允许它们具有不同的运行时等。NiFi仍将为您保留源代码跟踪,而实际上不会是c选择字节,而不是传递指向原始内容的指针。

是否不可能使用?请参阅:我不这么认为,我知道的唯一写入流文件的方法是使用OutputStreamCallback,它只有一个函数(进程),只接受一个参数(OutputStream)。是的,但是TeeOutputStream允许您有一个流写入两个单独的文件,是吗(这还不够?我不这么认为,TeeOutputStream会将相同的内容写入两个流,我的函数不会(例如我的示例中的“things”和“stuff”)。谢谢,我想写入多个流文件(这还不清楚,我会更新问题)使用session.write(flowfile,callback)方法。感谢您的帮助。我唯一的更改是将第一个OutputStream改为其他名称(和final)因此,您可以在内部函数中写入两者。我同意这是有其优点的,但是如果每个输入流都要进行大量处理,那么将它们全部扔掉,然后再进行一次(或两次并行)会感觉很浪费。这是一种折衷。谢谢。您可以进行中间处理(或“共享”)吗在单个处理器中进行处理,然后在操作不同时拆分为两个后续处理器?没有任何说明在处理器a完成时流文件内容必须处于特定状态,只要B和B'都可以接受a的输出作为输入。