2011-10-25 41 views
8

我做了一些搜索,但找不到任何示例/示例。閱讀一個記錄/項目並使用彈簧批次編寫多個記錄/項目

我有一個需求,從一個表(輸入)的地理座標被讀取,處理生成POI的關聯座標。因此,一個地理座標將導致需要將一個或多個POI插入到另一個表(輸出)中。

我正在使用JdbcCursorItemReader和JdbcBatchItemWriter讀取一個項目/記錄並寫入一個項目/記錄。還有一個ItemProcessor爲給定的地理座標生成POI。

自定義的JdbcBatchItemWriter能幫我實現嗎?

任何想法? TIA。

回答

4

如果你只是想傳播的項目,以不同​​的作家(閱讀副本輸出),您可以使用現有的CompositeItemWriter

,但我不知道,如果你的處理器將產生不同的項目類型,或者如果你要傳播一個複雜的項目類型多作家的內容,這種情況下,你可以使用稍微改變版本的multiline-record-writer問題

public class MultiOutputItemWriter implements ItemWriter<Object> { 

private JdbcBatchItemWriter<ClassFoo> delegateFoo; 
private JdbcBatchItemWriter<ClassBar> delegateBar; 

public void write(List<? extends Object> items) throws Exception { 
     // if you have different types of items 
     // check Object Class 
     // add to new List<Classfoo> 
     // call delegate e.g. delegateFoo.write(List with ClassFoo); 
     // 
     // or if you have complex objects 
     // same procedure as above, but with 
     // add to new List<Classfoo> with item.getClassFoo 
} 
} 

如果使用FlatFileItemWriter,不要忘了register the delegates as ItemStreams(所以春季批次將打開/關閉他們爲你)

+0

感謝邁克爾。我繼續尋找答案,並且或多或少地得出了相同的解決方案。我的物品處理器目前正在生成單個項目,但我可以修改它以返回項目列表。我打算使用單個寫入器並將多個相同類型的項寫入表中。我會給它一個鏡頭,看看是否適合我。 – user977505

+0

這對我有用。如上所示,我使用了一個正在返回項目列表和作者的處理器。然而,我用一個普通的jdbc模板w /批量更新插入項目到數據庫。關鍵部分是'List <?擴展對象>項目「。我不熟悉這個符號,並試圖從列表中讀取項目。再次感謝您的幫助。 – user977505

8

你真正尋找的被稱爲Splitter模式:

enter image description here

下面是它是如何在Spring Integration定義:

分離器是一種類型的消息端點,其職責是對的接受來自其輸入通道的消息,將該消息拆分爲多個消息,然後將每個消息發送到其輸出通道。這通常用於將「複合」有效載荷對象分成包含細分有效載荷的一組消息。

配置是非常簡單的:

<channel id="inputChannel"/> 

<splitter id="splitter" 
    ref="splitterBean" 
    method="split" 
    input-channel="inputChannel" 
    output-channel="outputChannel" /> 

<channel id="outputChannel"/> 

<beans:bean id="splitterBean" class="sample.PojoSplitter"/> 

或者你可以使用註解:

@Splitter 
List<LineItem> extractItems(Order order) { 
    return order.getItems() 
} 

當然你也可以寫自己的JdbcBatchItemWriter如果覺得簡單。然而Spring Integration已經爲你做到了。

您可以使用Spring Integration JDBC Support =>jdbc:inbound-channel-adapter/jdbc:outbound-channel-adapter和上述分配器來實現你想要的和簡單。

+0

只是好奇,是否也重新開始與春天的融合?換句話說,彈簧集成只是一個薄的可插拔模塊? –

+0

你肯定可以重新運行vs重新啓動(這是一個哲學討論,因爲rerun更清潔:)。但是如果你想從Spring Batch(薄型可插拔模塊)中使用它,你可以。雖然對於@ user977505的情況,單獨使用Spring集成和可能的某些SB組件(或不是)將會很好。 – tolitius

+0

感謝您的回覆。我會給它一個鏡頭,並更新線程。 – user977505

0

我通過擴展Writer類(在我的情況下是HibernateItemWriter)做到了這一點。我看到一個答案描述瞭如何使用「分離器」。如果任何人有一個工作的例子,說明如何在使用spring-boot-starter-parent的環境中工作,我很樂意看到它。對於我正在做的事情(從一條記錄創建一個List),如果Spring提供了一個處理List列表的寫入方法,那麼它會容易得多。

這是我如何擴展作家處理多次寫入了/讀取每一行處理:Spring-Batch Multi-line record Item Writer with variable number of lines per record