[英]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.