尝试自动装配 jobLauncher 时出现错误“尚未设置 JobRepository”

问题描述 投票:0回答:1

我目前正在尝试通过将 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>
java spring spring-mvc spring-batch
1个回答
0
投票

添加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 数据库依赖项,但任何数据源都是必要的,因为否则它会在作业存储库中丢失并且无法创建 - 我猜这是事务管理器的问题。

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