一尘不染

Spring Boot批次ResourcelessTransactionManager DataSourceProperties $DataSourceBeanCreationException

spring-boot

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

我尝试执行此操作的原因是我不希望任何状态持续存在,并且如果我不希望hsqldb以其开头,则我不希望浪费其内存。我有一个现有的Spring
Batch项目,它不使用Spring Boot,并且没有持久性,也没有hsqldb。

我使用此示例项目作为基础(但删除了hsqldb),并以其他答案作为参考,但我不断收到此异常:

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工作的清晰度。


阅读 890

收藏
2020-05-30

共1个答案

一尘不染

以下是一些用于设置数据源的基本Spring Boot属性。通过查看驱动程序类,启动可以推断您的数据库类型并可以自动创建DataSourcebean。

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缺少明确的信息,并且在classpath中没有提供内存数据库。

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

只要不使用任何数据源(例如,如果已配置ResourcelessTransactionManagerMapJobRepository),您的配置就可以了,只要您不使用它,EnableAutoConfiguration但是堆栈跟踪指示使用Boot
with即可EnableAutoConfiguration

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

日志转储了这一点-在bean创建过程之后,

排除项目:

org.apache.tomcat.jdbc.pool.DataSource

org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
2020-05-30