2016-05-17 41 views
0

spring-batchItemReaderを作成しようとしています。しかし、読者は各chunkに再度呼び出すと、(URLのページネーションのいくつかの種類につながる)チャンクパラメータを使用して追加データをフェッチする必要があります。現在のチャンクコンテキストでItemReaderを使用するには?

で構成
private final RestTemplate tempalte = new RestTemplate(); 

@Bean 
public ItemReader<MyDTO> getReader() { 
    return tempalte.exchange(url, HttpMethod.GET, headers, currentChunkIndex); //TODO how to? 
} 

@Bean

public Step step() { 
    return stepBuilder.get("jobname") 
     .<MyDTO, MyEntity>chunk(100) 
     .reader(getReader()) 
     .writer(getWriter()) 
     .build(), 
} 

質問:私はこれを達成できましたか?各chunk繰り返しでリーダーをリフレッシュし、さらにチャンクインデックス自体を使用しますか?

+0

'RestTemplate.exchange(...)メソッドは、' ResponseEntity 'を返します。それを 'ItemReader'にどのようにキャストすると思いますか? –

+0

'ItemReader.read()'は 'RestTemplate.exchange()'を呼び出すかもしれません。 – membersound

答えて

0

このメソッドがnullを返すまで、Spring Batchフレームワークは引き続きreader.read()を呼び出します。あなたがここに従わなければならないパターンは、あなたの読者にItemStreamを実装させ、updateメソッドを使用してページネーションブックマークを移動することです。

ジョブの実行中に、自分の進捗状況を追跡する状態変数をリーダーに保持します。また、エラーが発生した場合は、メソッド(ItemStreamの一部も含む)は、ステップのExecutionContextから状態を取得して、中止した箇所を取得します。 ItemStreamの詳細はhere in the Spring Batch docsです。

注:StepExecutionListenerを代わりに実装することで、非常に近いものを達成することもできます。

+0

したがって、現在の "チャンクインデックス"を実行またはステップコンテキストから読み取ることはできません。したがって、私はカスタムリーダーで自分自身を追跡しなければなりませんか? – membersound

+0

'ItemStream'の' update'メソッドは、この「チャンクインデックス」がどこから来ているのかを明確にしておいてください。最後に読んだレコードのインデックス番号であれば、どのようにあなたのコンテキストに入るのでしょうか? –

関連する問題