2017-01-02 10 views
1

私は、各行を読み込んでdbに挿入し、ファイルに書き込む1つのバッチを処理しています。私はこれをデータベースとファイルに書きます。したがって、ClassifierCompositeItemWriterを使用して特定の作家に電話する必要があります。私は、行を次のようしているファイルがあります。ここではオペレーションタイプに基づいて特定のライターを呼び出しますか?

DATA,I,1,John,Shiazo,Sushi

DATA,U,8,Pablo,Carmen

DATA,D,9,Diego,Sergio

DATA,I,10,rucha,rekha

が、私は挿入を意味し、Uは更新を意味し、Dは削除を表します。特定のライターを挿入するにはどのように呼び出すべきですか?その他は更新用です。もう1つは削除用です。この3人の作家は、操作(挿入、更新、削除)に基づいて別々に動作し、ファイルにデータを書き込むために常に作業するライターが1人あります。

@Classifier 
public List<String> classify(Object object) { 
    String type = "Success"; 
    List<String> list = new ArrayList<String>(); 
    if(person.getOperationType().contentEquals("I")){ 
     String insert = "I"; 
     list.add(type); 
     list.add(insert); 
    }else if(person.getOperationType().contentEquals("U")){ 
     String update = "U"; 
     list.add(type); 
     list.add(insert); 
    }else{ 
     delete = "D"; 
     list.add(type); 
     list.add(delete); 
    } 
} 

サンプルのXMLライターコード:以下

は私のサンプルコードです

<bean id="classifierFileItemWriter" class="org.springframework.batch.item.support.ClassifierCompositeItemWriter" scope="step">  <property name="classifier">   <bean class="org.springframework.classify.BackToBackPatternClassifier">    <property name="routerDelegate"> 
       <bean class="com.iz.batchprocessing.writer.SuccessFailClassifier" scope="step"/> 
      </property> 
      <property name="matcherMap"> 
       <map> 
        <entry key="I" value-ref="jdbcInsertItemWriter" /> //insert writer, here I want access ArrayList 
        <entry key="U" value-ref="jdbcUpdateItemWriter" /> //update writer, here I want access ArrayList 
        <entry key="D" value-ref="jdbcDeleteItemWriter" /> //delete writer, here I want access ArrayList 
        <entry key="Success" value-ref="successMultiFileItemWriter" /> //common file writer 
       </map> 
      </property> 
      </bean>  
     </property> </bean> 

私はこれを行うことができる方法を教えてください?あるいは、これを達成する他の方法がありますか?

+0

このリストはどこで準備していますか?プロセッサで?なぜあなたは3人の別個の作家が必要ですか?1人の作家では3つの異なる方法が働かないのですか? –

+0

はあなたの質問です。単に 'ClassifierCompositeItemWriter'の使い方ですか? –

+0

いいえ、私の質問は 'ClassifierCompositeItemWriter'の使い方ではありません。私はライターの分類子でこのリストを準備しています。私は春のバッチのxml構成を使用しているので、私は春のバッチについて多くのことを知っているように、私は春のバッチでは3つの異なるメソッドを作ることができません。ご存じの場合は、サンプルコードを投稿してください。 "Success and I"や "Success and D"や "Success and U"などの分類子から複数のパラメータを送信したい。この時点でのみ、私は立ち往生しています。 – rucha

答えて

0

私は作家のこのタイプに働いていないけどによってanother SO Question、答えを見て、 - セルカンArıkuşu、私はあなたがあなたのClassifierから値/キーを返却する必要があり、それが適切な作家をマップするためにmatcherMapによって使用されることがわかり。

キーが分類器から返されていないことがわかります。これらの文字列変数に代入するだけですが、何も返されません。

答えを見ると、Itemにそのキーを埋め込み、Classifierの各アイテムのそのキーを返す必要があると言えるでしょう。

答えMukesh Sabdeには完全なコードサンプルがあります。

リストに文字列を追加してリストを返す代わりに、連結された文字列を返す必要があります。これらの文字列は、マッチャーマップのキーである必要があります。 &

private Classifier<String, T> matcher; 

private Classifier<C, String> router;だからあなたはmatcherMapプロパティのキーとしてListを指定することはできません - 私はBackToBackPatternClassifierクラスのコードを見て

、それは2つのプライベートフィールドがあります。それは文字列でなければならず、あなたは間違っていました。

あなたのケースでは、Cは、スプリングバッチItemと書かれ、TItemWriterです。

希望すると助かります!

+0

私の質問にお答えいただき、ありがとうございます。あなたの答えは私を助けています。 そして、コードに投稿するのを忘れたリストを返すということを一つ追加したいと思います。お手数をおかけして申し訳ありません。 – rucha

+0

私は、リストを返す必要はなく、クラシファイアから 'person.getOperationType()'だけを返すと思います。また、私は、ライターに自動的にフィルタリングされるプロセッサによって返されたリストを推測する、あなたはそのフィルタリングを行うことになっていない。 –

+0

さて、コードを変更しました。私はあなたが 'person.getOperationType()'と言ったように文字列を返すだけです。現在、私は2つのライターを持っているcompositeWriterを持っています.1つは 'fileWriter'で、ファイルには常に書き込み、もう1つのライターは' DatabaseClassifierItemWriter'です。参照値を 'jdbcInsertItemWriter'、' jdbcUpdateItemWriter'、 'jdbcDeleteItemWriter'。しかし、私のファイルは生成されず、dbにも挿入されません。また、エラーはありません。 – rucha

関連する問題