@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 Batch 作业似乎没有开始
使用 Spring Boot 3,不需要
@EnableBatchProcessing
。如果添加它,Spring Batch 的自动配置(包括启动时自动启动作业)将会停止。
Spring Boot 3 的迁移指南中提到了这一点。
我面临的问题是它没有向 mariadb 数据库写入任何数据。
这是因为您正在使用
JpaTransactionManager
,但您的步骤不使用任何 JPA 读取器或写入器(您有 FlatFileItemReader
和 JdbcBatchItemWriter
)。将事务管理器更改为 JdbcTransactionManager
应该可以解决您的问题。