весенняя партия не катится по исключению времени выполнения в itemwriter - PullRequest
0 голосов
/ 01 ноября 2018

Я новичок в весенней партии, и у меня есть весенняя партия с проектом данных о пружине с базой данных Oracle. В основном для простоты у меня есть 2 шага:

Шаг 1: прочитать первую строку файла CSV, чем вставить в table_header в itemwriter

Шаг 2. Чтение из второй строки файла csv и вставка его в table_detail в itemwriter.

table_header связан с table_detail - отношение один ко многим.

В основном, если исключение во время выполнения сработало на шаге 2 сразу после сохранения сведений, тогда как на том же шаге данные не откатываются. В соответствии со ссылками на пружину они должны откатываться на исключение времени исполнения.

Я не уверен, что мне не хватает для отката транзакции, может кто-нибудь указать мне правильное направление, пожалуйста?

Пожалуйста, найдите ниже мою конфигурацию базы данных:

@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 голосов
/ 02 ноября 2018

Ваш менеджер транзакций не используется Spring Batch. Вам нужно определить bean-компонент BatchConfigurer, ссылающийся на него (см. Пример здесь ). Надеюсь, это поможет.

...