Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationExceptio

Posted

技术标签:

【中文标题】Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationException【英文标题】: 【发布时间】:2017-01-14 13:13:12 【问题描述】:

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

我尝试这样做的原因是我不希望任何状态持续存在,如果我不希望它开始,我宁愿不要用 hsqldb 浪费内存。我有一个没有使用 Spring Boot 的现有 Spring Batch 项目,它没有持久性,也没有 hsqldb。

我使用此sample project 作为基础(但删除了 hsqldb),并使用此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 工作的原因。

【问题讨论】:

【参考方案1】:

以下是一些用于设置数据源的基本 Spring Boot 属性。通过查看驱动程序类,引导可以推断您的数据库类型并可以自动创建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 信息,并且类路径中未提供内存数据库。

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

只要您不使用EnableAutoConfiguration,您的配置看起来就可以不使用任何数据源(即如果您已配置ResourcelessTransactionManagerMapJobRepository),但您的堆栈跟踪表明使用带有EnableAutoConfiguration 的引导.

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

编辑:我能够通过添加@SpringBootApplication(exclude=DataSource.class,DataSourceAutoConfiguration.class)来修复您的代码中的错误

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

排除:

org.apache.tomcat.jdbc.pool.DataSource

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

【讨论】:

我将问题更新为更清晰一点,我不想要持久性,你知道如何启用它吗? 在评论中,您说 我们在没有数据库的情况下以非 spring-boot 方式运行 spring-batch ,但是您的堆栈跟踪表明启动包,@987654331 @ 。我错过了什么吗? 抱歉,是的,我的意思是我已经spring-batch在运行没有弹簧启动和持久性,但我想知道如何 spring-boot一起工作。堆栈跟踪来自我尝试使其与 Spring Boot 一起使用。 我已经编辑了我的答案,希望对你有帮助!!我用 Spring Boot 运行了你的代码。 太好了,谢谢,解决了!原来我不需要指定ResourcelessTransactionManager ,我猜是因为我没有像你说的那样专门使用任何数据源。【参考方案2】:

您的问题似乎是您的配置中没有可用的数据源。 Spring Batch 需要数据库,因此保持其状态。

如果你在类路径上有一些,Spring Boot 可以自动在内存数据库中配置。您所指的示例应用程序在此处的 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 批处理配置为不保留其状态。我很确定这就是ResourcelessTransactionManager 的重点,对吧?我们在没有数据库的情况下以非 spring-boot 方式运行 spring-batch,它没有持久化任何状态,也没有抱怨。

以上是关于Spring Boot Batch ResourcelessTransactionManager DataSourceProperties$DataSourceBeanCreationExceptio的主要内容,如果未能解决你的问题,请参考以下文章

spring-boot-starter-jta-atomikos 和 spring-boot-starter-batch

Spring boot spring.batch.job.enabled=false 无法识别

Spring boot spring.batch.job.enabled=false 无法识别

Maven 打包“JAR”不适用于 spring-boot-starter-batch

Spring boot Batch 的启动原理- Configuration

spring boot(spring batch)配置禁用自动创建数据库