【问题标题】:Deleting flowfiles from apache nifi从 apache nifi 中删除流文件
【发布时间】:2020-10-14 20:17:59
【问题描述】:

以下是我正在处理的流程。

InvokeHTTP-->ExecuteScript-->ExecuteSQL

通过调用 HTTP,我得到两个流文件,一个带有请求,另一个带有响应。我已经为 ExecuteSQL 配置了事件驱动调度。由于在执行调用 HTTP 处理器后队列中有两个流文件,因此 ExecuteSQL 被触发两次,产生重复数据。我添加了带有以下常规代码的 ExecuteScript 处理器,以从队列中删除一个流文件。

import org.apache.nifi.processor.FlowFileFilter;
import org.apache.commons.io.IOUtils

def List<FlowFile> flowFileList = session.get(100)
def size = flowFileList.size();
log.error(size.toString())
int value = size as Integer;
def n=1;

for(FlowFile  k in flowFileList){
if( n!=value ){
session.remove(k)
}
n++;
}

但我遇到了异常。

org.apache.nifi.processor.exception.FlowFileHandlingException: StandardFlowFileRecord[uuid=27d84996-25a6-41a0-a3e8-06ed2354de18,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1592992841858-2, container=default, section=2 ], offset=18153, length=500],offset=0,name=72212066-7bcd-456b-ba97-252d18986f72,size=500] 传输关系未指定

我还在 for 循环中添加了 session.transfer(k,REL_SUCCESS)。但它也不起作用。谁能告诉我这里出了什么问题,并建议是否有一种更简单的方法可以删除除一个之外的所有流文件来实现上述场景?

【问题讨论】:

    标签: apache-nifi flowfile


    【解决方案1】:

    听起来你已经拥有来自InvokeHTTP 的所有关系进入下一个处理器。相反,将OriginalFailureRetryNo Retry 关系定向到不同的目标或在InvokeHTTP 处理器上自动终止它们。然后将Response 关系指向ExecuteSQL 处理器。您将不再需要 ExecuteScript 处理器,因为您将不再有多个流文件用于单个 HTTP 调用。

    您还应该再次将ExecuteSQL 处理器设置为定时器驱动

    【讨论】:

    • 安迪,只是另一个问题,如果前一个处理器产生多个流文件,那么只将一个流文件传递给下一个处理器的最佳方法是什么?
    • 这取决于您为什么要这样做——通常当您开发流程时,您希望在特定关系上生成的 每个 流程文件都被下一个处理器使用那流动。为什么不希望发生这种情况?
    • 我正在使用 Web 服务将记录插入到表中,并且我需要在插入所有记录后调用工作流。例如,如果调用 HTTP 处理器插入 3 条记录,它将产生 3 个响应流文件。因为我在前一个处理器之后放置了另一个调用 HTTP 处理器来调用工作流服务,所以它将被调用 3 次。我的用例是,无论记录的数量如何,工作流都应该只调用一个。所以,我想删除除一个之外的所有流文件,以便只调用一次工作流。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-25
    • 2022-11-03
    • 2016-11-13
    相关资源
    最近更新 更多