Spring boot 在Spring引导应用程序中启动Spring批处理作业问题

Spring boot 在Spring引导应用程序中启动Spring批处理作业问题,spring-boot,spring-batch,Spring Boot,Spring Batch,我已经在Spring启动应用程序中定义了多个Spring批处理作业。例如,job1,job2。等等 当我为其中一个作业编写junit测试时问题是,当我查看测试输出日志时,发现它试图启动此项目中定义的所有作业。 我在项目中使用了最新的稳定Spring Boot 1.2.5、Spring Batch 3.0.4 junit测试的片段代码如下 @RunWith(SpringJUnit4ClassRunner.class) @WebAppConfiguration @TransactionConfigu

我已经在Spring启动应用程序中定义了多个Spring批处理作业。例如,job1,job2。等等

当我为其中一个作业编写junit测试时问题是,当我查看测试输出日志时,发现它试图启动此项目中定义的所有作业。

我在项目中使用了最新的稳定Spring Boot 1.2.5、Spring Batch 3.0.4

junit测试的片段代码如下

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@TransactionConfiguration
@SpringApplicationConfiguration(classes = BatchApplication.class)
public class SubmitJobTest {

@Inject Job job1;

@Test
public void testLockJob() {

    logger.debug("lockId is @" + task.getLockId());

    JobParametersBuilder builder = new JobParametersBuilder()
            .addString("lockId", lockId.toString());
    try {
        JobExecution jobExecution = jobLauncher.run(this.job1, builder.toJobParameters());
        assertEquals(BatchStatus.COMPLETED, jobExecution.getStatus());

    } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException | JobParametersInvalidException ex) {
        ex.printStackTrace();
    }

}
我定义的一些作业需要运行JobParameters,所以当我运行此测试时,其他作业启动并执行,然后由于缺少特定的JobParameters而引发异常

我尝试将
@Named
添加到作业中,并使用唯一的名称将其注入,但得到了相同的结果

我自己解决了这个问题。
spring.batch.job.enabled=false
添加到
application.yml
后,它就可以工作了

  • 默认情况下不会启动作业
  • 当运行测试时,它像我预期的那样工作,只启动了一个作业

    • 你不能那样做。几周前我问了同样的问题:

      您必须直接使用JobLauncherCommandLineRunner:

      @RunWith(SpringJUnit4ClassRunner.class)
      @ContextConfiguration(classes = {MyBatchRootConfiguration.class})
      @IntegrationTest({"aProp=aValue"})
      public class MyBatchTestClass {
      
          @Autowired
          private JobLauncherCommandLineRunner runner;
      
         @Test
         public void launchTest() {
              String[] myArgs = new String[]{"jobParam1=value1"};
              runner.run(myArgs);
         }
      }
      

      注意:如果上下文中有多个可运行作业,则必须定义属性“spring.batch.job.names=job1”,以便在测试中仅启动job1(@IntegrationTest({“spring.batch.job.names=job1”})。问题是为什么Spring Boot在启动时自动启动作业,我需要手动运行我的作业。有可能禁止它启动作业吗?嗨,hansjoerg,我想我自己解决了这个问题,将
      Spring.batch.job.enabled=false
      添加到application.properties中以禁用启动自动化。