spring-batch - 如何使用单个读取器配置 Spring 批处理作业并根据返回的对象调用多个写入器

标签 spring-batch

下面是我目前正在使用的作业文件。

<batch:job id="job1">
    <batch:step id="step1">
        <batch:tasklet>
            <batch:chunk reader="reader" processor="processor" writer="ItemWriter" commit-interval="3">
            </batch:chunk>
        </batch:tasklet>
    </batch:step>
</batch:job>

最佳答案

正如 Luca 的评论中所说,您可以使用需要 org.springframework.classify.ClassifierClassifierCompositeItemWriter

后者的少数实现之一是 org.springframework.classify.BackToBackPatternClassifier,它依次采用 routerDelegatematcherMap

routerDelegate 是一个 bean,它将有一个用 @Classifier 注释的方法。此方法将获取一个 Object 并返回一个 String。然后,此字符串将与您在 module-context 中声明的值相匹配,并相应地调用 ItemWriter

这是一个例子:

<bean class="org.springframework.batch.item.support.ClassifierCompositeItemWriter">
    <property name="classifier">
        <bean class="org.springframework.classify.BackToBackPatternClassifier">
            <property name="routerDelegate">
                <bean class="xx.xx.xx.YourClassifier"></bean>
            </property>
            <property name="matcherMap">
                <map>
                    <entry key="value1">
                        <bean class="xx.xx.xx.YourItemWriter1></bean>
                    </entry>
                    <entry key="value2">
                        <bean class="xx.xx.xx.YourItemWriter2></bean>
                    </entry>
                </map>
            </property>
        </bean>
    </property>
</bean>

下面是分类器的样子(这是一个通用分类器,使用 Reflect API 调用作为对象参数传递的方法):

public class GenericClassifier<T> {

    private String methodName;

    @Classifier
    public String classify(T classifiable) {

        Method method;
        String value = "";

        try {
            // Get the method with Reflect
            method = classifiable.getClass().getMethod(methodName);

            // Call the method with Reflect
            value= (String) method.invoke(classifiable);
        } catch (Exception e) {
            // Error management
        }

        return value;
    }

    public void setMethodName(String methodName) {
        this.methodName = methodName;
    }
}

这个分类器是这样使用的,其中YourMethod是待分类对象的类的公共(public)方法(不带括号):

<bean class="xx.xx.xx.GenericClassifier">
    <property name="methodName" value="YourMethod"></property>
</bean>

Classifier 返回的 value 字符串然后与相应的 entrykey 相匹配matcherMap.

关于spring-batch - 如何使用单个读取器配置 Spring 批处理作业并根据返回的对象调用多个写入器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33330171/

相关文章:

java - 使用 spring batch 在两台不同机器上处理文件

java - Spring批处理中的提交间隔和处理回滚

Spring 批处理 : Horizontal scaling of Job Repository

java - 非法状态异常 : Cannot convert value of type to required type

java - var/task/org/springframework/cglib/core/NamingPolicy.class(权限被拒绝 )", "errorType": "java.io.FileNotFoundException"

java - kubernetes 上的可扩展 spring 批处理作业

java - PostgreSQL 函数的 Spring Batch ItemWriter 错误

java - 使用 FlatFileItemReader xML 的 Spring Batch 空文件

java - 如何在 Spring Batch 中使用并行和顺序流构建作业?