Spring Batch - 委托项目编写者

时间:2014-08-12 14:05:19

标签: spring-batch

我目前有以下弹簧批处理(v2.2.4)作业,该作业从单个数据源读取,然后创建三种不同的输出格式。我有三个步骤,每个步骤都有一个标准的reader,processsor和writer bean。我在下面用括号表示每个处理器或编写器使用的格式。此示例中的每个处理器都将SqlParameterSource对象返回给writer bean。

Job
    Step 1 - PolicyDetails
        R -> P(pd) -> W(pd)
    Step 2 - PolicyCharge
        R -> P(pc) -> W(pc)
    Step 3 - PolicyFund
        R -> P(pf) -> W(pf)

我不喜欢这样的事实,即我正在读取相同的数据三次,因此我计划在新工作中使用复合处理器。方括号表示复合处理器。我不确定我的新Writer(Wn)应该实现什么接口,因为它必须处理或委托三种不同对象类型的写入。

Option 1 Job
    Step 1
        R -> [P(pd) -> P(pc) -> P(pf)] -> Wn(pd,pc,pf)

我想知道是否有一个现有的spring批处理编写器类支持基于不同输入类型的委托?

修改

我已经定义了这个包装器接口,它将返回选项1中的每个处理器。

/**
 * This interface allows us to wrap a SqlParameterSource and link it to a specific HedgingTable. 
 * The ClassifierCompositeItemWriter will use the HedgingTable to route the SqlParameterSource to the correct writer.
 */
public interface HedgingDataSqlParameterSource {

    /**
     * The specific table that the SqlParameterSource data should be written to.
     */
    HedgingTable getHedgingTable();

    /**
     * The name value data for the insertion to the database table.
     */
    SqlParameterSource getSQLParameterSource();
}

我已经阅读了ClassifierCompositeItemWriter,但我仍然不确定如何过滤getHedgingTable()值。我是否重用现有的SubclassClassifier类或定义我自己的自定义分类器。

编辑2

我第一次尝试自定义分类器实现,它包装了SubclassClassifier。

/**
 * Return an ItemWriter for the provided HedgingDataSqlParameterSource based on reusing a SubclassClassifier
 * which maps the specific HedgingTable type to a ItemWriter.
 */
public class HedgingTableClassifier implements Classifier<HedgingDataSqlParameterSource, ItemWriter<HedgingDataSqlParameterSource>> {

    private SubclassClassifier<HedgingTable, ItemWriter<HedgingDataSqlParameterSource>> subclassClassifier = null;

    public ItemWriter<HedgingDataSqlParameterSource> classify(HedgingDataSqlParameterSource classifiable) {
        HedgingTable table = classifiable.getHedgingTable();
        return subclassClassifier.classify(table);
    }

    public SubclassClassifier<HedgingTable, ItemWriter<HedgingDataSqlParameterSource>> getSubclassClassifier() {
        return subclassClassifier;
    }

    public void setSubclassClassifier(
            SubclassClassifier<HedgingTable, ItemWriter<HedgingDataSqlParameterSource>> subclassClassifier) {
        this.subclassClassifier = subclassClassifier;
    }
}

1 个答案:

答案 0 :(得分:3)

查看ClassifierCompositeItemWriterhttp://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html)。这样,您就可以提供Classifier,根据您的逻辑,该ItemWriter将委派给相应的{{1}}。