【问题标题】:Spring Boot Application with Spring Batch not Running Jobs带有 Spring Batch 的 Spring Boot 应用程序未运行作业
【发布时间】:2017-04-20 08:29:54
【问题描述】:

我创建了 from here at spring's site 的 Spring Boot 应用程序。我正在篡改它并且基本上将它复制到两个工作中,因为我正在创建一个更大的应用程序,它将以这种方式构建。但什么都没有运行,我知道这很可能是我遗漏的一些小东西。

如果我像教程一样将所有内容都放入一个包中,它可以正常工作,但如果我将Application.java 提取到它自己的包中,它似乎不承认其他两个包。即使通过-Dspring.batch.job.names=myJob

这就是我的主要课程的全部内容:

@SpringBootApplication
@EnableBatchProcessing
public class Application implements CommandLineRunner {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

    @Override
    public void run(String... arg0) throws Exception {
        System.out.println("Running...");

    }
}

项目结构如下:

\---main
    +---java
    |   +---app
    |   |       Application.java
    |   |       
    |   +---job1
    |   |       Job1BatchConfiguration.java
    |   |       Job1JobCompletionNotificationListener.java
    |   |       Job1Person.java
    |   |       Job1PersonItemProcessor.java
    |   |       
    |   \---job2
    |           Job2BatchConfiguration.java
    |           Job2JobCompletionNotificationListener.java
    |           Job2Person.java
    |           Job2PersonItemProcessor.java
    |           
    \---resources
            sample-data-2.csv
            sample-data.csv
            schema-all.sql

同样,如果我将Application.java 放入job1job2 包中,则该作业将执行,如果我将它们全部放入一个包中并通过-Dspring.batch.job.names=job1,job2,它将同时执行(或者如果我想要一个)。但是,当Application.java 位于不同的包范围时,我怎样才能让这个命令工作呢?有没有办法让它看到那些?


编辑:所以看起来我可以用

注释我的Application.java
@Import({Job1BatchConfiguration.class, Job1JobCompletionNotificationListener.class, Job2BatchConfiguration.class, Job2JobCompletionNotificationListener.class})

但如果我超过了三个工作,这个解决方案似乎变得非常草率。有什么方法可以为作业压缩此功能?

【问题讨论】:

    标签: java spring spring-boot spring-batch


    【解决方案1】:

    我的问题已解决,将我的主类放在我的结构的包根目录中。

    使用显示的示例,应用程序的位置是:

    \---main
        +---java
        |   +---Application.java (Change location this file to package root)
        |   |       
        |   +---job1
        |   |       Job1BatchConfiguration.java
        |   |       Job1JobCompletionNotificationListener.java
        |   |       Job1Person.java
        |   |       Job1PersonItemProcessor.java
        |   |       
        |   \---job2
        |           Job2BatchConfiguration.java
        |           Job2JobCompletionNotificationListener.java
        |           Job2Person.java
        |           Job2PersonItemProcessor.java
        |           
        \---resources
                sample-data-2.csv
                sample-data.csv
                schema-all.sql
    

    【讨论】:

      【解决方案2】:

      在你的Application 类中添加@ComponentScan 的注解指向更高的包:

      @ComponentScan("app")
      

      或者你也可以包含多个包:

      @ComponentScan("app.job1", "app.job2")
      

      此注解扫描包并注册@Component 或其他bean,以及@Configuration 类。

      【讨论】:

      • 啊,你好。我知道这是我缺少的一些小东西,完全忽略了该功能。我离开了办公室,所以当我回来时我肯定会尝试这个,我相信我会发现我的问题会得到解决。再次感谢您的帮助伙伴
      最近更新 更多