我目前正在尝试通过将 jobLauncher 自动装配到控制器中来运行 Spring Batch 进程,这正是问题的提出者 here 正在尝试做的事情。但是,我收到一条错误消息,告诉我自动装配失败并且出现“
JobRepository has not been set
”,这是由 SimpleJobLauncher 上的 afterPropertiesSet() 方法 引起的。有谁知道这可能是什么原因造成的吗?
这是来自其他提问者的 Spring 配置,我也在使用:
<job id="writeProductsJob" xmlns="http://www.springframework.org/schema/batch">
<step id="readWrite">
<tasklet task-executor="taskExecutor">
<chunk reader="productItemReader" writer="productItemWriter" commit-interval="10" />
</tasklet>
</step>
</job>
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="5" />
</bean>
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="taskExecutor" ref="taskExecutor"/>
<property name="transactionManager" ref="transactionManager" />
</bean>
编辑:这是
tranactionManager
、jobRepository
和 jobLauncher
的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="transactionManager"
class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="jobRepository"
class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean">
<property name="transactionManager" ref="transactionManager" />
</bean>
<bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
</beans>
添加H2数据库依赖即可解决问题
implementation 'com.h2database:h2'
在 Gradle 或
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
在 Maven 中。然后设置到job中
jobLauncher.setJobRepository(jobRepository);
jobLauncher.afterPropertiesSet();
return jobLauncher;
如果您有其他数据源(例如 PostgreSQL 数据库或 MondoDB 等),则不需要 H2 数据库依赖项,但任何数据源都是必要的,因为否则它会在作业存储库中丢失并且无法创建 - 我猜这是事务管理器的问题。