繁体   English   中英

Spring @Async与每秒速率

[英]Spring @Async with rate per second

什么是实现@Async方法的最佳方法, @Async方法将以每Y毫秒/秒的X时间执行X次。

我已要求Amazon SES设置每秒仅发送14封电子邮件,这是我使用Spring的@Async注释异步进行的,但是据我所知,我只能设置最大池和最大队列大小,而不能设置速率。

这是我所拥有的:

@Bean(name = "emailSenderThreadPoolTaskExecutor")
public Executor emailSenderThreadPoolTaskExecutor() {

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(14); // send 14 at once
    executor.setMaxPoolSize(14);
    executor.setThreadNamePrefix("EmailThreadPool-");
    executor.initialize();
    return executor;
}

接着

@Async(value = "emailSenderThreadPoolTaskExecutor")
public void sendEmail(String emailTo, String subject) {
    //...
}

@Async批注仅表示方法的异步执行,不提供任何速率限制或其他功能。

一种笨拙的方法是使用大小为1的池,并且该方法本身具有72毫秒的延迟。 更好的方法是忘记@Async并使用旨在限制速率的内容。

开箱即用时,请考虑将更多重点放在您的需求上,让我将其作为非常有效的选择放在桌面上,在过去有时间计数器限制的情况下,我曾使用过这种选择。

名为Throttler的企业集成模式( EIP )可以完美解决此速率限制问题。

Apache Camel Throttler实现使您可以指定:

  • maximumRequestsPerPeriod =在您的情况下, 每个周期要限制的最大请求数 14
  • timePeriodMillis = 时间段(以毫秒为单位),在这种情况下,调节器最多允许您的案例中的最大maximumRequestsPerPeriod消息数 1000 (顺便说一下,这是默认值)

可以用XML或Java方式定义它,它还提供了异步非阻塞选项(如果电子邮件没有这样做,则此迭代将它们安排在下一个可用插槽中)。

提供EIP的Spring解决方案Spring Integration也应该有Throttler选项可用,但我自己还没有使用过Spring Integration。

再次,我理解学习新内容的开销,在这里您可能不会遇到这种新情况,但是我还是想概述一下以供将来参考和独立解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM