如何解决关系失败?

How to solve the relationship failure?

我有一个似乎正在正确创建 FlowFiles 的处理器(修改了一个标准处理器),但是当它进入 commit() 会话时,引发了一个异常:

2016-10-11 12:23:45,700 错误 [Timer-Driven Process Thread-6] c.s.c.processors.files.GetFileData [GetFileData[id=8f5e644d-591c-4df1-8c79-feea118bd8c0]] 未能由于 {} org.apache.nifi.processor.exception.FlowFileHandlingException 检索文件:未指定 StandardFlowFileRecord 传输关系

我假设这应该表示没有可用于提交传输的连接;但是,在 init() 期间注册了一个 "success" 关系,其方式与原始处理器的注册方式相同,并且成功关系 out 应该连接到另一个处理器输入。

对问题排查有什么建议吗?

您对标准处理器进行了哪些更改?如果您在 ProcessSession 对象上调用方法,请确保保存从这些方法调用返回的 FlowFile 的最新 "version",并且仅将最新版本传输到 "success".

FlowFile 引用是不可变的;通常在代码中,您会看到一个初始引用,如 "flowFile" 指向传入的流文件(例如来自 session.get()),然后它会随着流文件的变化而更新,例如 flowFile = session.putAttribute(flowFile, "myAttribute", "myValue") .

还要确保您已将每个不同流文件的最新版本(不是对同一流文件的各种引用)转移或删除到某种关系(如果需要,甚至 Relationship.SELF)。如果您的处理者创建了新的流程文件,请确保传输新的流程文件。如果不再需要传入流文件,请务必对其调用session.remove()

NiFi Developer's Guide 中有一些常见模式和其他指导,包括测试模式;您对该处理器的单元测试应该能够清除此错误(通过断言在测试期间应该将多少流文件传输到哪些关系)。