如何只传输一定量的流文件?

时间:2017-10-26 11:18:57

标签: groovy apache-nifi

我希望从前一个队列中获取一定数量的流文件,将其放入flowfileList中,如果列表大小等于此数量,我将开始传输它们但是当我尝试传输它们时,它并没有任何成功队列和故障队列。这是我的代码,我应该更改什么才能使其正常工作?

import org.apache.commons.io.IOUtils
import java.nio.charset.StandardCharsets
import groovy.lang.*
def flowFile = session.get()
name=flowFile.getAttribute("realName")
count=flowFile.getAttribute("count")
filename=flowFile.getAttribute("filename")
 value= count as Double;
def numb=Math.round(value)
def List<FlowFile> flowFiles=new ArrayList<>();
flowFiles.add(flowFile)


if(flowFiles.size()==numb){
for(FlowFile f  in flowFiles){
session.transfer(f,REL_SUCCESS)


}
flowFiles.clear();
}
session.remove(flowFile)

1 个答案:

答案 0 :(得分:1)

我想问题中的代码是针对具有groovy语言的ExecuteScript处理器。

您的代码中存在的问题:

脚本及其中声明的所有变量仅在每次处理期间出现。

每次从传入队列flowFile = session.get()获取一个流文件时,将其放入本地列表变量flowFiles.add(flowFile),然后删除文件session.remove(flowFile)。最后,在脚本结束时,所有变量都消失了(包括flowFiles列表)。

条件if(flowFiles.size()==numb){...}如果您numb>1,则始终返回false,因为flowFiles.size()始终等于算法中的1

如果只想在传入队列中存在多个文件时传输流文件,则代码可能如下所示:

def flowFile = session.get()
if (!flowFile) return
def numb=(flowFile.getAttribute("count") as Double).round()

//we already got one file, let's get the rest NUMB-1 files from incoming queue
def flowFiles = session.get(numb-1)
if (!flowFiles || flowFiles.size()<numb-1){
    //rollback everything we got from incoming queue
    session.rollback()
}else{
    //transfer first and other files to success
    session.transfer(flowFile, REL_SUCCESS)
    session.transfer(flowFiles, REL_SUCCESS)
}

但恕我直言,这种逻辑没有任何意义。

相关问题