복붙노트

[SPRING] CommandLineRunner 실행 실패 - 스프링 배치

SPRING

CommandLineRunner 실행 실패 - 스프링 배치

안녕하세요, 저는 Spring 배치에 익숙하지 않습니다. 해결할 수없는 다음 예외가 발생합니다.

java.lang.IllegalStateException: Failed to execute CommandLineRunner
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:781) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at com.demo.BatchDemo.main(KnpBatchApplication.java:16) [classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_72]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_72]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_72]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_72]
at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.0.1.RELEASE.jar:2.0.1.RELEASE]
Caused by: java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:653) ~[na:1.8.0_72]
at java.util.ArrayList.get(ArrayList.java:429) ~[na:1.8.0_72]
at org.springframework.batch.core.JobParametersBuilder.getNextJobParameters(JobParametersBuilder.java:265) ~[spring-batch-core-4.0.1.RELEASE.jar:4.0.1.RELEASE]
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.execute(JobLauncherCommandLineRunner.java:162) ~[spring-boot-autoconfigure-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.executeLocalJobs(JobLauncherCommandLineRunner.java:179) ~[spring-boot-autoconfigure-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.launchJobFromProperties(JobLauncherCommandLineRunner.java:134) ~[spring-boot-autoconfigure-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.autoconfigure.batch.JobLauncherCommandLineRunner.run(JobLauncherCommandLineRunner.java:128) ~[spring-boot-autoconfigure-2.0.1.RELEASE.jar:2.0.1.RELEASE]
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:797) [spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE]
... 10 common frames omitted

내 코드는 여기에 :

    @SpringBootApplication
    public class BatchDemo {
    public static void main(String args[])
    {
        SpringApplication.run(BatchDemo.class);
    }
}

exclude = BatchAutoConfiguration.class를 추가하여 문제를 해결할 수있었습니다. 그러나 나는 실제 원인을 찾아서 고치고 싶습니다.

커맨드 라인 인수를 전달하지 않고이 예외가 항상 발생하는 것은 아닙니다.

Pom.hml

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>demo</groupId>
<artifactId>demo_batch</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo_batch</name>
<url>http://maven.apache.org</url>
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

해결법

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

    1.@SpringBootApplication을 사용하면 Spring의 autoConfiguration이 기본적으로 활성화됩니다. 클래스 배치에 스프링 배치 종속성이로드되어 있으므로 스프링 배치 자동 구성도 사용 가능합니다.

    @SpringBootApplication을 사용하면 Spring의 autoConfiguration이 기본적으로 활성화됩니다. 클래스 배치에 스프링 배치 종속성이로드되어 있으므로 스프링 배치 자동 구성도 사용 가능합니다.

    응용 프로그램을 시작하는 동안 Spring Batch의 자동 구성 (BatchAutoConfiguration)은 Runner를 만들고 BatchConfig에 정의 된 모든 작업을 실행합니다.

    응용 프로그램 속성에서 spring.batch.job.enabled 속성을 false로 설정하거나 단순히 자동 구성 배치를 제외하여이 동작을 비활성화 할 수 있습니다.

    자세한 내용은 여기 및 여기를 참조하십시오.

  2. ==============================

    2.배치 작업이 실제로 실행되기를 원하고이 오류가 발생하면 Spring 배치 메타 데이터 테이블의 레코드에 불일치가 있는지 확인하십시오.

    배치 작업이 실제로 실행되기를 원하고이 오류가 발생하면 Spring 배치 메타 데이터 테이블의 레코드에 불일치가 있는지 확인하십시오.

    다음 JobParameters를 얻기 위해 Spring Batch는 작업과 동일한 JOB_NAME을 가진 최신 BATCH_JOB_INSTANCE를 검색 한 다음 데이터베이스에서 일치하는 BATCH_JOB_EXECUTION 레코드를 찾습니다 (JOB_INSTANCE_ID로 링크 됨).

    BATCH_JOB_EXECUTION에서 레코드를 삭제했지만 오류로 인해 BATCH_JOB_INSTANCE에서 일치하는 레코드를 삭제하지 않는 사내 작업을 실행했습니다.

    한 환경에서 작업을 실행 한 지 3 개월이 넘었으므로 더 이상 BATCH_JOB_EXECUTION 레코드가 없지만 BATCH_JOB_INSTANCE 레코드가 많이 있습니다. 우리는이 질문에 나열된 스택 추적을 여러 다른 Spring Batch 응용 프로그램에 반복적으로 던져서 어디에서나 온라인으로 솔루션을 찾을 수 없었습니다.

    우리는이 문제를 다음과 같이 해결했습니다.

  3. from https://stackoverflow.com/questions/50190952/failed-to-execute-commandlinerunner-spring-batch by cc-by-sa and MIT license