2

財務調整を行うためにバッチジョブを作成する必要があります。今私は3つのステップがあります:

ステップ1:サードパーティからXMLを読み取り、これをドメインオブジェクトに変換し、DB(表1)に書き込みます

ステップ2:トランザクションデータストアからflatFileを読み取り、DBに書き込みます(表2)

ステップ3:aggregatorObjectでテーブル1とテーブル2の両方を読み取り、両方のリストを処理して相違点を見つけ、ステータスコードを設定し、テーブル2にステータスコードを書き込みます。

私の問題はstep3にあります。ItemReaderを2つのSQLから読み取るための適切なソリューションが見つかりません。

私はこのようなカスタムItemReaderから始めました:

package batch.concilliation.readers;


@Component("conciliationReader")
public class TransactionReader implements ItemReader<TransactionsAgragegator>{

private final Logger log = Logger.getLogger(TransactionReader.class);

@Autowired
private ConciliationContext context;

@Autowired
private ServiceSommaireConciliation serviceTransactionThem;

@Autowired
private ServiceTransactionVirement serviceTransactionUs;


@Override
public TransactionsAgragegator read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {

    TransactionsAgragegator agregator = new TransactionsAgragegator();

    SommaireConciliationVirementInterac sommaire = serviceSommaireThem.findByRunNo(context.getRunNo());

    List<TransactionVirement> journalSic = serviceTransactionUs.findByTimestamp(sommaire.getBeginDate(), sommaire.getEndDate()); 

    // on place ces deux listes dans l'objet agregteur.
    agregator.setListeTransactionThem(sommaire.getPayments());
    agregator.setListeTransactionsUs(journalSic);

    return aggregator;
}

}

このリーダーは、テーブルを読み取り、ドメインオブジェクトを返す、すでに実装されている2つのサービス(DAO)を使用します。私は私たちとそれらからのトランザクションの2つのリストを取得し、それらをアグリゲーターオブジェクトに入れます。このオブジェクトはItemProcessorに渡され、ビジネスロジックを実行できます...しかし、このリーダーはnullを読み取らないため、無限ループを開始します。

ItemReaderAdapterについて読みましたが、nullを取得するまでコレクションをループするという同じ問題があります。

要約すると、2つの異なるテーブルを読み取り、2つのリストを取得したいと思います。

List<TransactionThirdParty>
List<TransactionHome>

次に、My ItemProcesssorは、両方のリストが等しいかどうか、一方が他方よりもトランザクションが多いか少ないかを確認します。

Spring Batchの専門家なら誰でも何か提案できますか?

4

1 に答える 1

2

ここでの問題は、最初の2つのステップがチャンク指向であるのに、3番目のステップはそうではないということです。最初の2つは通常の読み取り-プロセス-書き込みサイクルを持つ場合がありますが、最初の2つに依存する3番目のステップは1回限りの操作です。バッチドメインでファイルをコピーするのと同じです。

したがって、ここではItemReaderの方法を使用しないでください。終了基準がないためです(そのため、リーダーからnullを取得することはなく、行またはレコードを処理しないため、ソースがいつ使い果たされるかを知ることはできません。

それがTaskletStepが役立つところです

Taskletは、executeという1つのメソッドを持つ単純なインターフェイスであり、RepeatStatus.FINISHEDを返すか、失敗を通知するために例外をスローするまで、TaskletStepによって繰り返し呼び出されます。

したがって、チャンク指向の方法ではなく、タスクレットとして3番目のステップを実装します。

于 2012-11-08T08:23:38.033 に答える