【发布时间】:2018-11-08 09:53:55
【问题描述】:
我有一个计划每小时运行的作业,它使用 Spring ThreadPoolTaskExecutor bean 来触发对外部 API 的同时调用(每小时接近 100 个调用)。
@Bean
public TaskExecutor getExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
threadPoolTaskExecutor.setCorePoolSize(10);
threadPoolTaskExecutor.setMaxPoolSize(20);
return threadPoolTaskExecutor;
}
现在,外部 API 限制了请求数量,并允许每 30 秒发出一个请求。在拨打每个电话之前,我必须等待 30 秒。
在这种情况下,我发现使用 ThreadPoolTaskExecutor 不再有用。带有固定延迟配置的ThreadPoolTaskScheduler 可以工作吗?
处理此类 API 限制的最佳方法是什么?请帮忙
如果有帮助,我正在使用 Java 8、Spring Boot 2.0.1
【问题讨论】:
-
您实际上知道解决方案,一个具有 30 秒延迟触发器的
ThreadPoolTaskScheduler调度程序可以工作。你为什么不直接实施呢?有什么原因吗? -
@tmarwen 我在每小时运行的实际作业中使用了
@Scheduled和 cron 表达式。我可以在 ThreadPoolTaskScheduler 中有一个并发的固定延迟计划吗? -
@jusemar10 您可能希望控制@Scheduled 注释上的日程安排,而不要理会
ThreadPoolTaskScheduler。 -
我认为您真正需要的是某种方式来分散调用,以便知道自上次调用以来已经过去了多少时间,如果任务需要限制,则将它们放入队列中。尽管如果您不以有意义的方式更改您的应用程序,这些都无济于事:您必须对其进行更改,使其从每分钟 100 次调用变为最多 2 次调用。仅通过限制执行程序是无法实现的。
-
... 因为如果您只是更改执行程序,并且仍然加载 100 个任务而它最多可以处理 2 个任务,那么任务队列会很快被污染(至少每分钟 98 个,到准确)。
标签: java spring multithreading spring-boot threadpoolexecutor