如何在启动Tomcat服务器时运行长时间批处理作业?

3
我会在应用启动时使用 spring.batch.job.names=MyJob 启动一个 spring-batch 作业。
@Configuration
public class MyJob {
    @Bean
    public Job testJob() throws IOException {
        return jobBuilderFactory.get(MyJob.class.getSimpleName())
                .start(import())
                .build();
    }
}

很不幸,这会导致tomcat服务器启动延迟。该任务需要运行数分钟,因此我收到以下错误消息:

服务器 Tomcat v8.0 在 45 秒内无法启动。如果服务器需要更多时间,请尝试在服务器编辑器中增加超时时间。

问题是如何在不阻止tomcat启动的情况下运行此任务?例如异步运行此任务?

根据您当前的Spring Batch配置,有不同的方法可以使其工作。您能否发布一下您目前拥有的内容? - Gergely Bacso
这只是一个简单的作业类,按照配置的application.properties编写以启动作业。 - membersound
2个回答

2

0

您可以使用@Scheduled注释,并配置一个fixedDelay

有关更多信息,请参见参考文献中的任务执行和调度

最终我使用了这个解决方案来在启动时启动缓存预热:

private boolean isFirstTime = true;

@Scheduled(fixedDelay = 60000)
protected void refreshCachesStartup(){
    if(isFirstTime){
        // your code

        isFirstTime = false;
    }
}

编辑:请参考this问题,以获取更具体的观点。


但是 fixedDelay 会定期执行。我只想在启动时运行作业。 - membersound
嗯,感觉这有点像是一个hack。我也可以定义一个非常长的fixedDelay周期,但也许有更优雅的解决方案... - membersound
据我所知,没有内置的方法来实现这个。你可以使用Spring Boot的@ConditionalXXX注解(或者自己实现),但基本思路保持不变。 - Marco Ferrari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接