spring batch RepositoryItemWriter不将数据写入数据库

问题描述 投票:0回答:1
@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource appDataSource() {
        DataSourceBuilder builder = DataSourceBuilder.create();
        builder.driverClassName("org.mariadb.jdbc.Driver");
        builder.url("jdbc:mariadb://localhost:3306/people");
        builder.username("user");
        builder.password("pwd");
        return builder.build();
    }
}

@Configuration
public class BatchConfiguration {

    // tag::readerwriterprocessor[]
    @Autowired
    private DataSource dataSource;

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Bean
    public JpaTransactionManager transactionManager() {
        JpaTransactionManager transactionManager = new JpaTransactionManager();
        transactionManager.setEntityManagerFactory(entityManagerFactory);
        return transactionManager;
    }

    @Bean
    public FlatFileItemReader<Person> reader() {
        return new FlatFileItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new ClassPathResource("sample-data.csv"))
            .delimited()
            .names(new String[]{"firstName", "lastName"})
            .fieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }})
            .build();
    }

    @Bean
    public PersonItemProcessor processor() {
        return new PersonItemProcessor();
    }

    @Bean
    public JdbcBatchItemWriter<People> writer() {
        JdbcBatchItemWriter<People> writer = new JdbcBatchItemWriter<>();
        writer.setDataSource(dataSource);
        writer.setSql("INSERT INTO people (first_name, last_name) VALUES (?, ?)");
        writer.setItemPreparedStatementSetter((item, ps) -> {
            ps.setString(1, item.getFirstName());
            ps.setString(2, item.getLastName());

            // Log the item being processed
            System.out.println("Processing item: " + item);
        });
        return writer;
    }


    // end::readerwriterprocessor[]

    // tag::jobstep[]
    @Bean
    public Job importUserJob(JobRepository jobRepository,
            JobCompletionNotificationListener listener, Step step1) {
        return new JobBuilder("importUserJob", jobRepository)
            .incrementer(new RunIdIncrementer())
            .listener(listener)
            .flow(step1)
            .end()
            .build();
    }

    @Bean
    public Step step1(JobRepository jobRepository,
                      JpaTransactionManager transactionManager, JdbcBatchItemWriter<People> writer) {
        return new StepBuilder("step1", jobRepository)
            .<Person, People> chunk(10, transactionManager)
            .reader(reader())
            .processor(processor())
            .writer(writer)
            .build();
    }
    // end::jobstep[]
}

@SpringBootApplication
@EnableBatchProcessing(dataSourceRef ="appDataSource")
public class BatchProcessingApplication {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(BatchProcessingApplication.class, args);
    }
}

我面临的问题是它没有将任何数据写入mariadb数据库。它会自动创建数据库表,因此连接似乎不是问题。但是,当我使用内存数据库时,它成功写入数据。日志中没有错误,但 Spring Batch 作业似乎没有启动,下面还给出了 Pom 文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.1.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>batch-processing-complete</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>batch-processing-complete</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>17</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hsqldb</groupId>
            <artifactId>hsqldb</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
            <version>3.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

如果有人可以帮助我解决这个问题,我将不胜感激

spring spring-boot spring-batch batch-processing data-migration
1个回答
0
投票

Spring Batch 作业似乎没有开始

使用 Spring Boot 3,不需要

@EnableBatchProcessing
。如果添加它,Spring Batch 的自动配置(包括启动时自动启动作业)将会停止。

Spring Boot 3 的迁移指南中提到了这一点。

我面临的问题是它没有向 mariadb 数据库写入任何数据。

这是因为您正在使用

JpaTransactionManager
,但您的步骤不使用任何 JPA 读取器或写入器(您有
FlatFileItemReader
JdbcBatchItemWriter
)。将事务管理器更改为
JdbcTransactionManager
应该可以解决您的问题。

© www.soinside.com 2019 - 2024. All rights reserved.