我有一个Nifi处理器调用外部服务,可能需要几天才能返回结果。在此期间,处理器可以定期调用Thread.sleep()以放弃CPU。
问题在于,即使在onTrigger()方法中调用Thread.sleep(),NiFi处理器也不会读入并处理新的FlowFiles,因为它正在等待onTrigger()完成。从NiFi的角度来看,cpu仍然阻止异步调用完成。
在NiFi处理器的onTrigger()方法中进行异步调用时,有没有办法保持并发性?
答案 0 :(得分:1)
Val Bonn关于将异步FlowFiles推回到WAIT队列的建议很有效。随着异步请求的进入,java Process对象被创建并保存在内存中。然后将FlowFile路由到WAIT关系,该关系连接回处理器。定期根据相应的进程检查来自WAIT队列的FlowFiles以查看它是否已完成,然后路由到SUCCESS关系,否则它们将受到惩罚。这允许启动许多长时间运行的异步进程,而无需为每个传入请求分配宝贵的cpu资源。复杂性的一个来源是处理从UI调用的处理器关闭。在这些情况下,调用onStopped方法,等待所有内存进程完成并将stderr和stdout存档到磁盘。当处理器再次启动时,存档将被回读并与WAIT队列中的任何FlowFiles配对。