有没有办法在NiFi的自定义处理器中同时写入不同的流?例如,我有第三方库使用类似这样的API进行重要处理:
public void process(InputStream in, OutputStream foo, OutputStream baa, List<String> args)
{
...
foo.write(things);
baa.write(stuff);
...
}
但我能找到的唯一例子都只使用一个输出流:
FlowFile transform = session.write(original, new OutputStreamCallback() {
@Override
public void process(OutputStream out) throws IOException {
out.write("stuff");
}
});
处理是分批完成的(由于它的规模很大),因此执行所有处理然后写出单独的流程是不切实际的。
我能想出的唯一方法是多次处理输入:(
为了澄清,我想使用session.write(flowfile, callback)
方法写入多个FlowFiles,以便可以单独发送/管理不同的流
答案 0 :(得分:4)
NiFi API基于一次处理一个流文件,但您应该可以执行以下操作:
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);
}
});
答案 1 :(得分:3)
由于您使用相同的输入进行不同的输出,您可能还会考虑将这些步骤分解为专注于执行其特定功能的离散处理器。在上面你显示“东西”和“东西”所以例如我建议你有一个'DoThings'和'DoStuff'处理器。在您的流程中,您可以通过两次简单地使用源连接将相同的流文件发送到两者。然后,这可以实现良好的并行操作,并允许它们具有不同的运行时间等。 NiFi仍将为您保留起源痕迹,它实际上根本不会复制字节,而是将指针传递给原始内容。