在自定义处理器

时间:2017-05-25 20:20:24

标签: java etl apache-nifi

我在自定义NiFi处理器中针对不同时间范围从远程API服务进行数据提取。

我有时间范围全局计数器,每次迭代都会更新(我使用定时器驱动的调度策略)。

当计数器大于最大值时,我想从 SUCCESS 关系中仅从请求(session.get())转移 FlowFile ,即不执行其他操作逻辑:

session.transfer(requestFlowFile, SUCCESS);

我认为在时间范围收集结束时我无法停止或暂停处理器。所以我尝试使用上述方法作为解决方案。

所有迭代都很顺利,直到计数器变得超过最大值并且处理器尝试从请求(session.get())传输 FlowFile

所以我有这个例外:

由于org.apache.nifi.processor.exception.FlowFileHandlingException,

无法处理会话:StandardFlowFileRecord [uuid = 459e615b-0ff5-424f-aac7-f95d364cdc13,claim =,offset = 0,name = 99628180019265,size = 0]在本次会议中不知道

这里有什么问题?或者可能是另一种方法?

2 个答案:

答案 0 :(得分:2)

该错误意味着传递给session.transfer()的流文件来自不同的会话。您只能在调用get()的同一会话中调用transfer()。

答案 1 :(得分:0)

如果它是自定义处理器 - 只是不要执行session.get()并跳过此执行而不转移任何内容。

或者如果您需要传入文件来做出决定,您可以获取它,进行一些检查,并使用惩罚rollback(true)回滚当前会话,这样您获得的文件将保留在传入队列中Penalty Duration处理器参数,无需运行rocessor。

或者您可以session.get( FlowFileFilter )从传入的队列中获取与您的逻辑匹配的文件