如何根据返回对象配置单个读取器并调用多个写入器Spring批处理作业 [英] How to configure a Spring batch job with single reader and calling multiple writers depending on object returned

查看:29
本文介绍了如何根据返回对象配置单个读取器并调用多个写入器Spring批处理作业的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是我当前使用的作业文件。

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

推荐答案

正如卢卡的评论中所说,您可以使用需要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是要分类的Object的类的公共方法(不带括号):

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

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

这篇关于如何根据返回对象配置单个读取器并调用多个写入器Spring批处理作业的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆