복붙노트

[SPRING] 스프링 부트 배치 ResourcelessTransactionManager DataSourceProperties $ DataSourceBeanCreationException

SPRING

스프링 부트 배치 ResourcelessTransactionManager DataSourceProperties $ DataSourceBeanCreationException

Java 구성을 사용하여 ResourcelessTransactionManager 트랜잭션 관리자를 사용하는 스프링 부트 배치 프로젝트를 설정하려고하지만 운이 좋지 않습니다.

내가 이것을하기 위해 노력하는 이유는 어떤 상태가 지속되기를 원하지 않기 때문에, 나는 그것을 시작하고 싶지 않으면 hsqldb로 메모리를 낭비하지 않기를 바란다. 스프링 부트를 사용하지 않는 기존의 스프링 배치 프로젝트가 있고, 지속성이없고 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가 작동하기를 원하는지에 대한 명확성을 추가했습니다.

해결법

  1. ==============================

    1.다음은 데이터 소스를 설정하기위한 기본 스프링 부트 등록 정보입니다. 드라이버 클래스를 살펴보면, 부팅은 db 타입을 추론 할 수 있으며 DataSource 빈을 자동으로 생성 할 수 있습니다.

    다음은 데이터 소스를 설정하기위한 기본 스프링 부트 등록 정보입니다. 드라이버 클래스를 살펴보면, 부팅은 db 타입을 추론 할 수 있으며 DataSource 빈을 자동으로 생성 할 수 있습니다.

    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에 명시 적으로 항목을 제공하거나 클래스 경로에 메모리 내장 db (H2, HSQL 등)를 포함하여 문제를 수정하십시오.

    EnableAutoConfiguration을 사용하지 않고 스택 추적에서 EnableAutoConfiguration으로 Boot 사용을 표시하는 한 모든 데이터 소스 (예 : ResourcelessTransactionManager 및 MapJobRepository를 구성한 경우)를 사용하지 않아도 구성이 정상적으로 보입니다.

    데이터 소스를 선택적으로 사용하지 않도록 설정하는 것은 허용되지 않습니다. 질문을 참조하십시오.

    편집 : @ SpringBootApplication (exclude = {DataSource.class, DataSourceAutoConfiguration.class}) 추가하여 코드에서 오류를 해결할 수있었습니다.

    덤프 된 로그 - 빈 생성 프로세스 후,

    org.apache.tomcat.jdbc.pool.DataSource
    
    org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
    
  2. ==============================

    2.귀하의 문제는 귀하의 구성에서 사용 가능한 데이터 소스가없는 것 같습니다. Spring Batch는 데이터베이스를 유지해야하므로 상태가 유지됩니다.

    귀하의 문제는 귀하의 구성에서 사용 가능한 데이터 소스가없는 것 같습니다. Spring Batch는 데이터베이스를 유지해야하므로 상태가 유지됩니다.

    Spring Boot는 classpath에 어떤 것이 있으면 자동으로 메모리 DB를 구성 할 수 있습니다. 언급하신 예제 애플리케이션은 https://github.com/spring-projects/spring-boot/blob/v1.4.0.RELEASE/spring-boot-samples/spring-boot-sample-batch에서 POM에 포함 된 HSQL을 포함합니다. /pom.xml#L26

    따라서 문제를 해결하려면 데이터베이스에 대한 액세스를 정의하십시오.

  3. from https://stackoverflow.com/questions/39359840/spring-boot-batch-resourcelesstransactionmanager-datasourcepropertiesdatasource by cc-by-sa and MIT license