从 apache nifi 中删除流文件

Deleting flowfiles from apache nifi

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

调用HTTP-->ExecuteScript-->ExecuteSQL

通过调用 HTTP,我得到了两个流文件,一个带有请求,另一个带有响应。我已经使用事件驱动调度配置了 ExecuteSQL。由于执行调用 HTTP 处理器后队列中有两个流文件,因此 ExecuteSQL 被触发两次,从而生成重复数据。我已经使用以下 groovy 代码添加了 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) 。但它也不起作用。谁能告诉我这里出了什么问题,并建议是否有一种更简单的方法来删除除实现上述情况的文件之外的所有流文件?

听起来您将 InvokeHTTP 中的所有关系都输入了下一个处理器。相反,将 OriginalFailureRetryNo Retry 关系指向不同的目的地或 自动终止 它们InvokeHTTP 处理器。然后将 Response 关系指向 ExecuteSQL 处理器。您将不需要 ExecuteScript 处理器,因为单个 HTTP 调用将不再有多个流文件。

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