Nifi:如何从flowFile列表中仅传输最后一个文件?

时间:2017-12-07 10:59:47

标签: groovy apache-nifi

我想从queu中获取所有文件大小超过831的流文件然后将它们放入列表中,然后从列表中捕获最后一个流文件并转移到成功关系,最后删除所有其他流文件,这里是我的代码抛出转移关系未指定的例外情况,在这种情况下我应该改变什么?

 import org.apache.nifi.processor.FlowFileFilter;
import groovy.json.JsonSlurper
import groovy.json.JsonBuilder
import java.nio.charset.StandardCharsets
import org.apache.commons.io.IOUtils

def flowFile = session.get()
def  n=0;
if(!flowFile)return
def size = flowFile.getAttribute('fileSize');
log.error(size.toString())
int value = size as Integer;

if((value/831)>1){
def ffList = session.get(new FlowFileFilter(){
    public FlowFileFilterResult filter(FlowFile ff) {

        if( size == ff.getAttribute('fileSize') ) n++; return FlowFileFilterResult.ACCEPT_AND_CONTINUE
        return FlowFileFilterResult.REJECT_AND_CONTINUE
    }

})
session.transfer(ffList.get(n-1),REL_SUCCESS)
//session.remove(ffList);
}
session.remove(flowFile);

1 个答案:

答案 0 :(得分:1)

如果从队列中获取流文件,则必须对其进行操作。

此代码返回一个flowFile列表:

def ffList = session.get(new FlowFileFilter(){...})

如果你的魔杖只是移除所有这些,除了最后一个,只需在转移最后一个之后放入此代码:

session.remove( ffList[0..-2] )

我想这一行有一个错误:

if( size == ff.getAttribute('fileSize') ) n++; return FlowFileFilterResult.ACCEPT_AND_CONTINUE

在任何情况下都执行了return FlowFileFilterResult.ACCEPT_AND_CONTINUE命令,因为它不在if下。

我认为应该是这样的:

if( size == ff.getAttribute('fileSize') ){
    n++; 
    return FlowFileFilterResult.ACCEPT_AND_CONTINUE
}