当前位置: 首页 > 知识库问答 >
问题:

spring批量委托项目编写器

蒋高扬
2023-03-14

我目前有以下spring批处理(v2.2.4)作业,它从单个数据源读取,然后创建三种不同的输出格式。我有三个步骤,每个步骤都有一个标准的读取器、处理器和写入器bean。我使用下面的括号来表示每个处理器或写入器使用的格式。本例中的每个处理器都向writer bean返回一个SqlParameterSource对象。

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个答案

燕扬
2023-03-14

看看ClassifierCompositeItemWriter(http://docs.spring.io/spring-batch/trunk/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html)。这允许您提供一个分类器,它将根据您的逻辑委托给适当的项目编写器

 类似资料:
  • 我目前正在编写一个Spring批处理,其中我正在读取一个数据块,并对其进行处理,然后我希望将此数据传递给两个Writer。一个writer将简单地更新数据库,而第二个writer将写入csv文件。 我计划编写自己的自定义编写器,并在customItemWriter中注入这两个ItemWriter,并在customItemWriter的write方法中调用这两个ItemWrite的write方法。这

  • 关于文章Spring批处理CompositeItemWriter如何管理委托编写器的事务?,对于复合项编写器事务管理,难道不应该将数据源包装在如下所示的事务管理器中吗?没有下面的bean定义,事务管理就无法与Oracle和Hikari CP一起工作。不确定帖子中提供的示例是如何工作的。请澄清

  • 事务在Spring批处理中未回滚。我有意抛出异常来测试事务回滚。即使从项目编写器引发异常,数据库事务也在提交。下面是写入器中保存到DB中的方法。对象是注入到此类中的 jpa 存储库 我尝试用@Transactional(传播=Propagation.REQUIRES_NEW, rollbackFor=Exception.class)标记上述方法的事务,但它仍然在提交事务。我肯定我错过了一些东西。任

  • 我正在扩展这个Spring批处理CompositeItemWriter如何为委托编写器管理事务?这里的问题: 在我的例子中,下面有一个,它将数据写入同一个数据库的多个表中,在写入数据之前,它通过实现各种业务规则来转换数据。在这里,一个记录可能满足不同的业务规则等,因此一个编写器可能获得比其他编写器更多的数据。 场景-假设第一个writer工作得很好,第二个writer生成异常,然后第三个和第四个w

  • 我必须像这样配置批处理作业流。 XML文件阅读器- 我的定制处理器是这样的 这是一个好的方法吗?我看到了一些CompositeProcess、CompositeWriter的例子,但没有一个适合我的案例。 提前谢谢。