2017-10-26 6 views
0

私は以前のキューからフローファイルを取得し、それを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

質問のコードは、Groovy言語のExecuteScriptプロセッサ用です。


アイデアに対するあなたのコードに問題:

スクリプトとそれに宣言されているすべての変数は、各処理中にのみ存在しています。

受信キューflowFile = session.get()から1つのフローファイルを取得するたびに、ローカルリスト変数flowFiles.add(flowFile)に入力して、ファイルsession.remove(flowFile)を削除します。最後にスクリプトの最後に、すべての変数が消えています(flowFilesリストを含む)。 flowFiles.size()は、常にあなたのアルゴリズムで1に等しいので、あなたがnumb>1を持っている場合

条件if(flowFiles.size()==numb){...}は常にfalseを返します。


あなたはファイルのexect番号が着信キュー内に存在している場合にのみ、フローファイルを転送する場合、コードは次のように考えられます。

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) 
} 

が、IMHO、このロジックは何のローミングサービスを持っていません。

+0

セッションはどのようにnifiでflowfilelistを取得しますか?exfpleは5つのフローファイルを取得し、3つはsuceessキューの10個のファイルです。最後のファイルflowfileを再度読み込みますか? –

+0

flowfilesがプロセスセッションにあるのは否定できないのですが、フローファイルリストにそれらを置くと処理できませんbacuase相対的なプロセスセッションが削除されましたか? –

+0

私もあなたも試してみましたが、成功した関係にも何も入れていません。例外はありません。 –

関連する問題