Spring 启动批处理 ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException

Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException

我正在尝试设置一个 spring 启动批处理项目,该项目使用 ResourcelessTransactionManager 事务管理器,使用 Java 配置,但我没有运气。

我尝试这样做的原因是我不希望任何状态持续存在,如果我不希望 hsqldb 开始,我宁愿不要浪费内存。我有一个现有的 Spring 批处理项目,它没有使用 Spring 引导,并且它在没有持久性且没有 hsqldb 的情况下工作。

我正在使用此 sample project as the base (but with hsqldb removed), and this other answer 作为参考,但我一直收到此异常:

Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Cannot determine embedded database driver class for database type NONE. If you want an embedded database please put a supported one on the classpath. If you have database settings to be loaded from a particular profile you may need to active it (no profiles are currently active).
    at org.springframework.boot.autoconfigure.jdbc.DataSourceProperties.determineDriverClassName(DataSourceProperties.java:218) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.createDataSource(DataSourceConfiguration.java:42) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration$Tomcat.dataSource(DataSourceConfiguration.java:55) ~[spring-boot-autoconfigure-1.4.0.RELEASE.jar:1.4.0.RELEASE]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_73]
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) ~[na:1.8.0_73]
    at java.lang.reflect.Method.invoke(Unknown Source) ~[na:1.8.0_73]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.2.RELEASE.jar:4.3.2.RELEASE]
    ... 56 common frames omitted

这是我修改的:

@SpringBootApplication
@EnableBatchProcessing
@Configuration
public class SampleBatchApplication {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    @Bean
    protected Tasklet tasklet() {

        return new Tasklet() {
            @Override
            public RepeatStatus execute(StepContribution contribution,
                    ChunkContext context) {
                return RepeatStatus.FINISHED;
            }
        };

    }

    @Bean
    public Job job() throws Exception {
        return this.jobs.get("job").start(step1()).build();
    }

    @Bean
    protected Step step1() throws Exception {
        return this.steps.get("step1").tasklet(tasklet()).build();
    }


    public static void main(String[] args) throws Exception {
        // System.exit is common for Batch applications since the exit code can be used to
        // drive a workflow
        System.exit(SpringApplication
                .exit(SpringApplication.run(SampleBatchApplication.class, args)));
    }

    @Bean
    ResourcelessTransactionManager transactionManager() {
        return new ResourcelessTransactionManager();
    }

    @Bean
    public JobRepository getJobRepo() throws Exception {
        return new MapJobRepositoryFactoryBean(transactionManager()).getObject();
    }

}

我需要做什么才能让它使用 ResourcelessTransactionManager

编辑:更清楚地说明了我希望 ResourcelessTransactionManager 工作的原因。

您的问题似乎是您的配置中没有可用的数据源。 Spring 批处理需要数据库以保持其状态。

Spring 如果类路径上有一些,引导可以在内存数据库中自动配置。您所指的示例应用程序在此处的 POM 中包含 HSQL:https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-samples/spring-boot-sample-batch/pom.xml#L26

因此,要解决您的问题,请定义对数据库的访问。

下面是一些用于设置数据源的基本 spring 启动属性。通过查看驱动程序 class ,引导可以推断您的数据库类型并可以自动创建 DataSource bean。

spring.datasource.driver-class-name
spring.datasource.url
spring.datasource.username
spring.datasource.password
spring.datasource.tomcat.max-active
spring.datasource.tomcat.initialSize
spring.datasource.tomcat.maxIdle

最后三个属性用于在容器中设置连接池。 显式 DataSource 信息缺失,class 路径中未提供内存数据库。

通过在 application.properties 中明确提供条目或在 class 路径中包含内存数据库(H2、HSQL 等)来解决问题。

你的配置看起来没有使用任何数据源(即如果你配置了 ResourcelessTransactionManager & MapJobRepository )只要你不使用 EnableAutoConfiguration 但你的堆栈跟踪表示 Boot with EnableAutoConfiguration 的用法。

我猜,选择性禁用数据源是不允许的,see question

编辑: 我可以通过添加 @SpringBootApplication(exclude={DataSource.class,DataSourceAutoConfiguration.class})

来修复您代码中的错误

日志转储这个 - 在 bean 创建过程之后,

排除:

org.apache.tomcat.jdbc.pool.DataSource

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration