gpt4 book ai didi

java - 如果作业未完成,Spring 调度程序不会运行

转载 作者:太空宇宙 更新时间:2023-11-04 12:07:52 27 4
gpt4 key购买 nike

我正在尝试为我的 Spring 应用程序创建一个库。它有一个预定的作业,它是自动配置的,并且在大多数情况下作为包含的 Maven 依赖项工作。

我有一个网络应用程序,它基本上只是向其他网络应用程序发出大量请求(一些基本的负载测试和故障检测)。请求者实现是完全异步的(它也有一个手动配置的异步执行器)。 Web 应用程序也有定期作业,但它无法在 2 分钟时间范围内可靠地完成其作业。还好啦。但是。

当我开始在第二个描述的服务器上使用第一个描述的库时,该库开始工作不可靠。它不再每 2 分钟触发一次。我没有足够的 Spring 知识来找出原因。

我最好的选择是服务器洪水方法启动大量异步任务,并且调度程序也启动这些任务,并且这些请求将进入同一个消息队列。

是否有任何方法可以将我的 libs 计划任务与其他服务器计划任务分开,并使它们每 2 分钟可靠运行一次?

最佳答案

所以我的研究很有趣......似乎只有配置异步执行器才会强制调度程序也使用它。但如果您也实现了schedulerConfigurer,您将获得另一个专用于计划任务的线程池。

所以我的实现是这样的,用于分离 2 个线程池。

@SpringBootApplication
@EnableAsync
@EnableScheduling
@ComponentScan
public class WebService extends AsyncConfigurerSupport implements SchedulingConfigurer {
public static void main(String[] args) {
System.setProperty("http.proxyHost", "localhost");
System.setProperty("http.proxyPort", "8888");
System.setProperty("spring.config.name", "web-server");
SpringApplication.run(WebService.class, args);
}
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(2);
executor.setMaxPoolSize(4);
executor.setQueueCapacity(500);
executor.setThreadNamePrefix("tester-");
executor.initialize();
return executor;
}
@Bean(destroyMethod = "shutdown", name = "scheduledExecutor")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(100);
}

@Autowired
@Qualifier(value="scheduledExecutor")
Executor scheduledExecutor;

@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(scheduledExecutor);
}

仍然不够清楚我是否可以为我的库创建一个单独的线程池,但现在已经足够好了。

关于java - 如果作业未完成,Spring 调度程序不会运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40180547/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com