根据操作类型调用特定的编写器?

时间:2017-01-02 05:54:36

标签: java spring-batch batch-processing

我正在处理一个批处理,它读取每一行并插入到db以及写入文件中。我想在数据库和文件中写下这个数据。因此需要使用DATA,I,1,John,Shiazo,Sushi调用特定的编写器。我的文件有以下行:

DATA,U,8,Pablo,Carmen

DATA,D,9,Diego,Sergio

DATA,I,10,rucha,rekha

@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); } }

这里,我代表插入,U代表更新,D代表删除。我应该如何调用一个特定的编写器进行插入,另一个用于更新,还有一个用于删除。这三个编写器将根据操作(插入,更新和删除)以不同的方式工作,还有一个编写器将始终用于在文件中写入数据。

以下是我的示例代码:

<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>

示例xml编写器代码:

{{1}}

请告诉我该怎么做?或者还有其他方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:0)

我没有在这类作家上工作,但通过查看another SO Question并回答 - SerkanArıkuşu,我发现您需要从Classifier返回一个值/键,这将是由matcherMap用于映射适当的编写者。

我发现你没有从分类器中返回任何,你只是为这些String变量赋值但没有返回任何东西。

通过查看该答案,我可以说您需要在正在撰写的Item中嵌入该密钥,并从Classifier中为每个项目返回该密钥。

Mukesh Sabde的回答有一个完整的代码示例。

不是将字符串添加到List并返回List,而是应该返回连接的字符串,这些字符串应该是匹配器映射中的键。

我查看了BackToBackPatternClassifier类的代码,它有两个私有字段 - private Classifier<C, String> router;&amp;

private Classifier<String, T> matcher;

因此,您无法将List指定为matcherMap属性的关键字。它必须是一个字符串,你错了。

对于您的情况,C是要编写的Spring Batch Item,而TItemWriter

希望它有所帮助!!