【问题标题】:Spring ThreadPoolTaskExecutor with fixed delay?具有固定延迟的 Spring ThreadPoolTask​​Executor?
【发布时间】: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 表达式。我可以在 ThreadPoolTask​​Scheduler 中有一个并发的固定延迟计划吗?
  • @jusemar10 您可能希望控制@Scheduled 注释上的日程安排,而不要理会ThreadPoolTaskScheduler
  • 我认为您真正需要的是某种方式来分散调用,以便知道自上次调用以来已经过去了多少时间,如果任务需要限制,则将它们放入队列中。尽管如果您不以有意义的方式更改您的应用程序,这些都无济于事:您必须对其进行更改,使其从每分钟 100 次调用变为最多 2 次调用。仅通过限制执行程序是无法实现的。
  • ... 因为如果您只是更改执行程序,并且仍然加载 100 个任务而它最多可以处理 2 个任务,那么任务队列会很快被污染(至少每分钟 98 个,到准确)。

标签: java spring multithreading spring-boot threadpoolexecutor


【解决方案1】:

您可以执行以下操作。

  1. 配置TaskExecutor。您已经这样做了。
  2. 编写一个您希望以预定方式调用的方法并使用@Scheduled 进行注释。

     @Scheduled(fixedDelay = 3600000)
     void doSomething() {
     }
    

上面的代码将每 1 小时触发一次。

【讨论】:

  • 我已经有了这个设置。我的问题是如何限制当前每次作业运行时并行触发大约 100 次的 API 调用。
  • 这将始终限制任务,即使过去 10 分钟内没有任何任务运行。
  • 同意@M.Prokhorov。您的问题不在 Spring 提供的调度基础设施领域。您可能必须建立自己的逻辑。也许您自己的自定义逻辑(或重用来自 Java 本身或 Spring 的较低级别的任务管理基础架构)将任务提交给中间处理器。该中间处理器将跟踪时间戳,并协调连续提交之间的适当延迟。
猜你喜欢
  • 2021-01-02
  • 1970-01-01
  • 2017-03-02
  • 2018-07-29
  • 1970-01-01
  • 2015-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
相关资源
最近更新 更多