我希望从前一个队列中获取一定数量的流文件,将其放入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)
答案 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)
}
但恕我直言,这种逻辑没有任何意义。