3

次のアーキテクチャ(レイヤー)を持つSpringバッチを使用してバッチアプリケーションを設計しています:

  • すべてのスプリング バッチ コード (ファイルの読み取り、処理、および書き込み) を配置する最上位モジュール。この最上位モジュールは、特定の形式のファイルに固有です。したがって、将来的には、新しいフォーマットの読み取り/処理/書き込みができる新しい並列モジュールを作成する可能性があります。形式に関係なく、ファイルの各行は実行する特定の操作に対応しています。たとえば、各行は「行項目 X を注文 Y に追加する」操作を表す場合があります。そのため、各行について、読み取りと処理が完了したら、すぐ下のレイヤーの必要な操作を呼び出すカスタム ItemWriter を使用します。
  • さまざまなバッチ操作を実装するビジネス ロジック層。これらの各操作は、ドメイン層オブジェクトを使用して実装されます。たとえば、「Add line ite; X to order Y」操作は、OrderRepository を使用して注文を取得し、次に注文の addLineItem メソッドを呼び出すことによって実装されます。
  • すべてのドメイン オブジェクトを含むドメイン レイヤー。前の例に続いて、Order エンティティと LineItem エンティティがあります。

私の質問は次のとおりです。

  • 最上位モジュールとビジネス ロジック層の間のインターフェイスに使用するベスト プラクティス (おそらく特定の設計パターン) はありますか?
  • 各ファイルには 1 つの注文のみの行が含まれていると仮定しましょう。各行を記述する単純な方法は、行ごとに 1 つのバッチ操作を呼び出すことです。この場合、各行に対して OrderRepository への呼び出しが実行されて注文が取得され、注文が保存されます。行がチャンクごとに書き込まれる別のアプローチを考えています (Spring バッチで行うように)。書き込み操作が受け取る引数の型は List です。この 2 番目のアプローチに従って、関連する注文にチャンクを追加するために必要なデータをビジネス オペレーションに渡す必要があります。トップ モジュールとビジネス ロジック層の間で情報を渡すために使用するフォームはどれですか?

ありがとう

4

1 に答える 1

4

最上位モジュールとビジネス ロジック層の間のインターフェイスに使用するベスト プラクティス (おそらく特定の設計パターン) はありますか?

すでに知られているベスト プラクティスとは異なる実際のベスト プラクティスはありませんが、バッチはパフォーマンスの要件/制約に対処する必要があり、さらに多くの場合パフォーマンスの問題が発生するため、私のベスト プラクティスは次のとおりです。

  • データとデータフローについて考える
  • どのくらいのデータ?
  • ボトルネックは何ですか?(処理と書き込み、多くの場合、書き込み部分)

ライターとビジネスレイヤーのインターフェースにインスピレーションを与えるために

  1. businessLayer.addOrderItem メソッドを使用できるItemWriterAdapterを使用します。
  2. 独自のラッパーを作成する
  3. ビジネス レイヤーをライターに移動します。バッチ最適化されたビジネス レイヤーを再利用する必要はほとんどありません。

バッチ コンテキストではリストとバッチ SQL を使用したいので、オプション 2 を使用します。

いつものように、それはあなたの特定の要件に依存します:-)

ItemWriter ラッパーの例

public class SimpleItemWriter implements ItemWriter<SimpleItem> {

    @Override
    public void write(List<? extends SimpleItem> items) throws Exception {        
        // do something, e.g. delegate to another spring bean
    }
}

ItemWriterAdapter の構成例

<bean id="sample-item-writer-adapter" class="org.springframework.batch.item.adapter.ItemWriterAdapter">
    <property name="targetObject" ref="businessLayerBean" />
            <property name="targetMethod" value="doSomething"
</bean>

<step id="splitFilesStep">
     <tasklet>
         <chunk 
             reader="itemReader" 
             writer="sample-item-writer-adapter" 
             commit-interval="5">
         </chunk>
     </tasklet>
 </step>
于 2012-04-25T08:21:44.457 に答える