我目前有以下 spring 批处理(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 回答
看一下
ClassifierCompositeItemWriter
(http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html) . 这允许您提供Classifier
,它将根据您的逻辑委派给相应的ItemWriter
.