1

Step Listener と Writer の間で複数の変数を渡す必要があります。StepCtx.setTransientUserData() を使用すると、1 つの変数しか渡すことができません。

複数の変数を渡すには、マップ/クラスを作成して渡す必要がありますか、それともより良い方法がありますか?

4

2 に答える 2

1

おっしゃる通り、JobContext や StepContext に関係なく、それらのメソッドsetTransientUserData(Object)は 1 つの変数しか渡すことができず、これは実用的ではありません。たぶん、複雑な用途向けに設計されていないだけなのかもしれませんが、わかりません。

ただし、独自のコンテキストを定義して変数を格納できます。すべてのクラスでこのインスタンスを共有する場合は、シングルトンにします。

import javax.inject.Named;
import javax.inject.Singleton;

@Named
@Singleton
public class MyContext {

    private int rowCount;
    private Map<String, String> params;
    // or other things ...

}

次に、 CDI を介しMyContextItemWriter、カスタマイズしたコンテキスト クラスを で使用できます。StepListener

public class MyItemWriter implements ItemWriter {

    @Inject
    private MyContext myContext;

    // then use it in your preferred method
}

ただし、前の質問でステップ パーティションについて言及したように、ジョブはおそらくマルチスレッドで実行されています。同時実行の問題に注意する必要があります: の属性に適切なデータ構造を使用する必要がありますMyContext

于 2016-06-20T14:58:10.960 に答える