2017-01-02 39 views
1

我正在使用一個批處理,它讀取每一行並插入到db以及寫入文件中。我想在數據庫以及文件中寫下這些數據。所以需要使用ClassifierCompositeItemWriter來調用特定的作者。我有一個具有以下行文件:根據操作類型調用特定的作家?

DATA,I,1,John,Shiazo,Sushi

DATA,U,8,Pablo,Carmen

DATA,D,9,Diego,Sergio

DATA,I,10,rucha,rekha

在這裏,我代表插入,U表示更新和d代表刪除。我應該如何調用一個特定的作家插入,其他是爲了更新,還有一個是爲了刪除。這三個編寫者將根據操作(插入,更新和刪除)以不同的方式工作,並且還有一個編寫者總是用於在文件中寫入數據。

下面是我的示例代碼:

@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

你準備好這份清單的哪個位置?在處理器?爲什麼你需要三個獨立的作家,一個作家中的三種不同的方法不起作用? –

+0

是你的問題,只是問,如何使用'ClassifierCompositeItemWriter'? –

+0

不,我的問題不是如何使用'ClassifierCompositeItemWriter'。我正在編寫分類器中準備這份清單。由於我使用spring批處理的xml配置,因爲我對Spring批處理知道得太多,所以我無法在spring批處理中創建三種不同的方法。如果您知道,請發佈示例代碼。 我想從分類器發送多個參數,例如「Success and I」或「Success and D」或「Success and U」。只有在這一點上,我堅持着。 – rucha

回答

0

我還沒有這種類型的作家,但通過看another SO Question和答案的工作 - 塞爾坎Arıkuşu,我看你需要從Classifier返回一個值/鍵,將由matcherMap用於映射適當的作家。

我看到你沒有返回任何從你的分類器,你只是分配給這些字符串變量,但不返回任何東西。

通過觀察這個問題的答案,我可以說,你需要嵌入該密鑰在Item被寫入並從Classifier返回每個項目的這把鑰匙。

通過回答Mukesh Sabde找到了一個完整的代碼示例。

而不是將字符串添加到列表並返回列表,您應該返回串聯的字符串,這些應該是匹配器映射中的鍵。

我看着BackToBackPatternClassifier類的代碼,它有兩個私人領域 - private Classifier<C, String> router; &

private Classifier<String, T> matcher; 

所以你不能指定ListmatcherMap屬性鍵。它必須是一個字符串,你錯了。

對於你的情況,C是要寫的彈簧批ItemTItemWriter

希望它有幫助!

+0

謝謝你回答我的問題。在某種程度上,你的答案對我有幫助。 我想補充一件事,即我回來了忘記發佈在代碼中的列表。對不起,讓你麻煩。 – rucha

+0

我想,你不需要返回列表,但只能從分類器中調用'person.getOperationType()'。另外,我想,處理器返回給作家的列表會自動被過濾,你不應該做這個過濾。 –

+0

好的,我現在更改了我的代碼。我只返回字符串,如你所說'person.getOperationType()'。現在,我有一個compositeWriter,其中有兩個編寫器,一個是'fileWriter',它總是寫入文件,另一個編寫器是'DatabaseClassifierItemWriter',因爲我使用'jdbcInsertItemWriter','jdbcUpdateItemWriter'將映射鍵映射爲引用值。 'jdbcDeleteItemWriter'。但是現在我的文件都沒有生成,也沒有插入到數據庫中。而且,也沒有錯誤。 – rucha