webサービス呼び出しとしてCSVファイルが取得されています。今私は一時ディレクトリにsetResourceとしてReaderに提供するために保存しています。springバッチのファイルの代わりにストリームからの読み込みitemReader
最初にファイルを保存する代わりに、stream(byte [])をそのまま使用する方法はありますか?
webサービス呼び出しとしてCSVファイルが取得されています。今私は一時ディレクトリにsetResourceとしてReaderに提供するために保存しています。springバッチのファイルの代わりにストリームからの読み込みitemReader
最初にファイルを保存する代わりに、stream(byte [])をそのまま使用する方法はありますか?
ItemReader
の方法setResource
は、org.springframework.core.io.Resource
をパラメータとする。このクラスにはすぐに使用できる実装がいくつかありますが、その中でorg.springframework.core.io.InputStreamResource
があります。このクラスのコンストラクタは、java.io.ByteArrayInputStream
で実装できるjava.io.InputStream
を受け取ります。
技術的には、はい、ItemReader
のbyte[]
パラメータを消費することができます。
1)独自のFlatFileItemReader
を作成します(CSVがフラットファイルであるため)、それはStepExecutionListener
public class CustomFlatFileItemReader<T> extends FlatFileItemReader<T> implements StepExecutionListener {
}
2を実装します:実際には、ここではいくつかのアイデアであることを行う方法について今
、 )をオーバーライド)内のあなたのWebサービス呼び出しを行い、beforeStep
メソッドをオーバーライドし、変数
private byte[] stream;
@Override
public void beforeStep(StepExecution stepExecution) {
// your webservice logic
stream = yourWebservice.results();
}
3に結果を保存しますメソッドを使用して、stream
を実際のリソースとして渡します。
@Override
public void setResource(Resource resource) {
// Convert byte array to input stream
InputStream is = new ByteArrayInputStream(stream);
// Create springbatch input stream resource
InputStreamResource res = new InputStreamResource(is);
// Set resource
super.setResource(res);
}
あなたがItemReader以内にあなたのWebサービスを呼び出すためにしたくない場合にも、あなたは、単にJobExecutionContext
のバイト配列を格納し、stepExecution.getJobExecution().getExecutionContext().get("key");
優れた答えを
beforeStep
方法でそれを得ることができる、とポイント。ありがとう@Thrax – explorerジョブランチャーを使ってジョブを起動しているときにストリームを渡す方法はありますか?それはjobParametersを渡すのと同様ですか?私はファイルを取得するための別のサービスを持っているし、私はそれを読み込むバッチジョブを開始したい。 – explorer
@explorer残念ながら、 'JobParameters'は' String'、 'Long'、' Date'、 'Double'型しか渡すことができません。この記事によれば、http://forum.spring.io/forum/spring-projects/batch/96660-how-to-pass-complex-objects-to-job-launcherによると、外部ストレージを使用するか(saveあなたのファイル)にアクセスすることができるBeanを宣言するか、Beanを宣言します。 – Thrax