Spring批处理不会在Itemwriter中的运行时异常上滚动

时间:2018-11-01 05:50:50

标签: spring-boot spring-data spring-batch spring-transactions

我是spring批处理的新手,我有一个带有spring数据项目和oracle数据库的spring批处理。基本上为了简单起见,我有2个步骤:

步骤1:读取csv文件的第一行,而不是在itemwriter的table_header中插入

第2步:从csv文件的第二行读取内容,而不是在itemwriter中的table_detail中插入

table_header链接到table_detail-一对多关系。

基本上,如果在保存详细信息之后在步骤2中触发了运行时异常,而同一步骤中的数据不会回滚。根据spring引用,它应该在运行时异常时回滚。

我不确定我想让交易回滚到什么地方,有人可以指出我正确的方向吗?

请在下面找到我的数据库配置:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef = "dummyEntityManager", transactionManagerRef = "dummyTransactionManager", basePackages = {
        "com.dummy.persistence" })
@PropertySource("file:${test_PROPERTIES}")
public class DatabaseConfig extends HikariConfig {


    @Bean(name = "dummyDatasource")
    public HikariDataSource dataSource() {
        HikariDataSource hikariDataSource = new HikariDataSource();
        hikariDataSource.setJdbcUrl(CipherWrapper.getInstance().decrypt(jdbcUrl));
        hikariDataSource.setUsername(CipherWrapper.getInstance().decrypt(username));
        hikariDataSource.setPassword(CipherWrapper.getInstance().decrypt(password));
        hikariDataSource.setAutoCommit(false);
        hikariDataSource.setMaximumPoolSize(maximumPoolSize);
        hikariDataSource.setMinimumIdle(minimumIdle);
        return hikariDataSource;
    }


    @Bean(name = "dummyEntityManager")
    public LocalContainerEntityManagerFactoryBean dummyEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean = builder.dataSource(dataSource())
                .packages("com.dummy.persistence.entity").persistenceUnit("dummyPersistenceUnit").build();

        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());


        return localContainerEntityManagerFactoryBean;
    }


    @Bean(name = "dummyTransactionManager")
    public PlatformTransactionManager dummyTransactionManager(
            @Qualifier("dummyEntityManager") EntityManagerFactory dummyEntityManagerFactory) {
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager(dummyEntityManagerFactory);
        jpaTransactionManager.setRollbackOnCommitFailure(true);
        return jpaTransactionManager;
    }


@Bean
public BatchConfigurer batchConfigurer(@Qualifier("dummyEntityManager") EntityManagerFactory dummyEntityManagerFactory) {
        return new DefaultBatchConfigurer() {
                @Override
                public PlatformTransactionManager getTransactionManager() {
                        return  dummyTransactionManager(dummyTransactionManager);
                }
        };
}
}

请在以下两个步骤配置中找到:

@Bean("step1")
public Step headerSaveStep() {

StepBuilder stepBuilder = stepBuilderFactory.get(Flow.STEP1.toString());
SimpleStepBuilder<HeaderDetailsDto,HeaderDetailsAdditionaDto> simpleStepBuilder = stepBuilder
        .<HeaderDetailsDto, HeaderDetailsAdditionaDto>chunk(1);
simpleStepBuilder.reader(csvItemReader.csvFileVatPayerDetailsItemReader(null));
simpleStepBuilder.processor(EnrichmentProcessor());
simpleStepBuilder.writer(headerWriter());
simpleStepBuilder.allowStartIfComplete(true);
return simpleStepBuilder.build();

}

@Bean("step2")
public Step detailSaveStep() {

StepBuilder stepBuilder = stepBuilderFactory.get(Flow.STEP2.toString());
SimpleStepBuilder<DetailsDto, DetailsDto> simpleStepBuilder = stepBuilder
        .<DetailsDto, DetailsDto>chunk(20000);
simpleStepBuilder.reader(csvItemReader.csvFileBuyerDetailsFileItemReader(null));
simpleStepBuilder.writer(detailsWriter());
simpleStepBuilder.allowStartIfComplete(true);
return simpleStepBuilder.build();

}

1 个答案:

答案 0 :(得分:0)

Spring Batch未使用您的事务管理器。您需要定义一个引用它的BatchConfigurer bean(请参见示例here)。希望这会有所帮助。