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

标签 java spring-batch batch-processing

我正在处理一个批处理,它读取每一行并插入数据库以及写入文件。我想将以下数据写入数据库和文件中。因此需要使用ClassifierCompositeItemWriter调用特定的编写器。我的文件包含以下行:

数据,I,1,约翰,Shiazo,寿司

数据,U,8,巴勃罗,卡门

数据,D,9,迭戈,塞尔吉奥

数据,I,10,rucha,rekha

这里,I代表插入,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>

请告诉我该怎么做?或者还有其他方法可以实现这一点吗?

最佳答案

我没有研究过这种类型的作家,但通过查看 another SO Question并由 - Serkan Arıkuşu 回答,我发现您需要从 Classifier 返回一个值/键matcherMap 将使用它映射合适的作家。

我发现您没有从分类器返回任何,您只是对这些字符串变量进行赋值,但没有返回任何内容。

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

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

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

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

private Classifier<String, T> matcher;

所以你不能指定 List作为 matcherMap 的关键属性(property)。它必须是一个字符串,而你错了。

对于您的情况,C是 Spring 批处理 Item待写和 TItemWriter

希望对你有帮助!!

关于java - 根据操作类型调用特定的编写器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41421960/

相关文章:

java - org.springframework.beans.factory.NoSuchBeanDefinitionException : No bean named 'documentumServiceForIDP' is defined

java - JPA EntityManager 与 Hibernate - 查找和删除不会从数据库中删除数据

java - 如何使用注释将作业参数传递给项目处理器

amazon-web-services - AWS Sagemaker 使用 Parquet 文件进行批量转换作业?

java - 如何使用提示设置 intellij 项目模板

java - 为什么 char[] 优于 String 作为密码?

java - Spring Batch 作业实例已存在

python - 如何在Python中形成打乱的批处理?

java - 如何使用实体管理器和条件在 hibernate 中创建批量更新?