【问题标题】:How to disable autorun of Job Spring Batch when starting the application如何在启动应用程序时禁用 Job Spring Batch 的自动运行
【发布时间】:2021-06-03 22:38:50
【问题描述】:

春季启动应用程序。 在设置中,我在应用程序启动时禁用了自动运行作业(Spring Batch):

spring:
  batch:
    job:
      enabled: false

任务计划在 75 秒后开始:

@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;

@Scheduled(fixedRate = 10000000, initialDelay = 75000)
public void launchJob() throws Exception {
  JobParameters params = new JobParametersBuilder()
       .addString("JobID", String.valueOf(System.currentTimeMillis()))
       .toJobParameters();
  jobLauncher.run(job, params);
}

75 秒后启动 Job 方法。但是当应用程序启动时,Spring Batch 仍然运行。由于某种原因,它忽略了设置。 以下是它在 pom.xml 文件中的拼写方式:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-batch</artifactId>
</dependency>

我尝试使用 Spring Batch 创建一个单独的简单应用程序,那里一切正常,发布显然按计划进行。我不明白主应用程序中可能存在什么冲突?

【问题讨论】:

  • “应用程序启动时 Spring Batch 仍在运行”是什么意思?如果launchJob 只在 75 秒后运行,还有什么能立即启动?
  • 缓存可能。试试 mvn clean
  • 他的意思是他通过应用程序属性禁用了批处理,但它仍然在 75 秒后开始批处理,这是 launchJob 的初始延迟。他不希望它开始。
  • 如果@BeshambherChaukhwan 说的是真的,那么我认为你的期望是错误的。根据 Spring 文档,“默认情况下,将创建一个 Runner,并且上下文中的所有作业都将在启动时执行。使用 spring.batch.job.enabled=false 禁用此行为。”该标志仅与作业是否运行有关,因为它们在启动时处于上下文中。使用 \@scheduled 注解安排的作业不受该标志的影响。这是一个我认为说同样的话的教程:dimitr.im/spring-batch-schedu
  • 应用程序启动时立即开始执行作业。并且应该只在 75 秒后运行 JobLauncher。运行(作业,参数)

标签: java spring-boot spring-batch


【解决方案1】:

您可以在应用程序的任何位置创建一个维护标志,并在 Spring Boot 的 Application 类中添加以下方法,您可以像下面的方法一样将您的变量标记为 true,然后您可以根据此标志处理您的调度程序

@PostConstruct
public void postApplicationStarted() {
    System.out.println("Started after Spring boot application !");
    applicationStarted = true;
}



@Scheduled(fixedRate = 10000000, initialDelay = 75000)
public void launchJob() throws Exception {
  if(applicationStarted) { 
    JobParameters params = new JobParametersBuilder()
            .addString("JobID", String.valueOf(System.currentTimeMillis()))
            .toJobParameters();
    jobLauncher.run(job, params);
   }
}

【讨论】:

  • 对不起我的英语。我可能解释得不好。 launchJob() 方法在 75 秒后启动。没有问题。但是我的 Job 的 ItemReader 方法在 5-10 秒后启动。我什至不知道它从哪里开始。我需要把这面旗帜放在哪里。我需要在严格定义的时间开始工作。
  • 首先您需要确定 ItemReader 从哪里开始,如果您使用的是 IDE,那么您可以拉一个调试点并查看,或者您可以从 ItemReader 方法抛出异常并分析堆栈跟踪,就您而言想知道这个标志的位置,创建一个配置类并从那里读/写你的 applicationStarted 变量
猜你喜欢
  • 2015-11-03
  • 1970-01-01
  • 2018-03-10
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 2018-08-21
  • 1970-01-01
  • 2020-06-30
相关资源
最近更新 更多