无法执行CommandLineRunner - Spring Batch

时间:2018-05-05 15:14:44

标签: spring spring-boot spring-batch

您好我是Spring批次的新手,我收到以下我无法解决的异常:

LinkedList

我的代码:

IndexOutOfBoundsException

我可以通过添加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 来解决此问题。但我想找到真正的原因并解决它。

我没有传递任何命令行参数,并且此异常不会一直发生。

的pom.xml

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

3 个答案:

答案 0 :(得分:3)

使用@SpringBootApplication时,默认情况下会启用Spring的自动配置。由于您在类路径中加载了spring批量依赖项,因此也启用了Spring Batch AutoConfiguration。

在应用程序启动期间,Spring Batch的自动配置(BatchAutoConfiguration)创建一个Runner并运行BatchConfig中定义的所有作业。

您可以通过在应用程序属性中将spring.batch.job.enabled属性设置为false来禁用此行为,也可以直接排除批量自动配置,就像您一样。

请参阅herehere了解详情。

答案 1 :(得分:1)

对于希望其批处理作业实际执行并且遇到此错误的任何人,请尝试检查Spring批处理元数据表中的记录是否存在任何不一致之处。

要获取下一个JobParameters,Spring Batch会搜索与您的工作相同的BATCH_JOB_INSTANCE的最新JOB_NAME,然后在数据库中查找匹配的BATCH_JOB_EXECUTION记录(由JOB_INSTANCE_ID链接)。

我们有一个内部任务正在运行,该任务从BATCH_JOB_EXECUTION中删除了记录,但是由于错误,没有从BATCH_JOB_INSTANCE中删除匹配的记录。

在一个环境中,自从我们执行任何作业以来已经有3个月了,所以我们不再有BATCH_JOB_EXECUTION条记录,但是有许多BATCH_JOB_INSTANCE条记录。我们反复在多个不同的Spring Batch应用程序之间抛出了此问题中列出的堆栈跟踪,但找不到在线解决方案。

我们通过以下方式解决了该问题

  1. 运行SQL以从BATCH_JOB_INSTANCE中没有匹配记录的BATCH_JOB_EXECUTION中删除-这在短期内取消了作业的阻塞;并且,
  2. 使用spring-batch-toolkit将清除任务替换为工作;它提供了RemoveSpringBatchHistoryTasklet,可以正确删除记录。

答案 2 :(得分:0)

我收到此错误,这是因为我正在从遵循一般命名约定和类型的文件夹中读取文件。我错误地在同一目录中留下了一个图像文件,我的代码无法处理它并抛出此错误。

相关问题