Spring @Async 每秒速率
Spring @Async with rate per second
什么是实现 @Async
方法的最佳方法,每 Y 次 milliseconds/seconds 执行 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
并使用用于速率限制的东西。
考虑到更多关注您的需求,让我把它放在 table 作为一个非常有效的选项,我在过去的类似情况下使用过计时器限制。
名为Throttler
的企业集成模式(EIP)可以完美解决这个限速问题。
Apache Camel Throttler implementation让你指定:
maximumRequestsPerPeriod
= 每个周期限制的最大请求数 在你的情况下 14
timePeriodMillis
= 以毫秒为单位的时间段,在您的情况下节流器最多允许 maximumRequestsPerPeriod
条消息 1000(顺便说一句,这是默认值)
这可以用 XML 或 Java 方式定义,它还提供异步非阻塞选项(如果电子邮件没有使其在本次迭代中安排它们在下一个可用时段发生) .
Spring Integration,提供 EIP 的 Spring 解决方案,应该也有 Throttler 选项可用,但我没有使用 Spring Integration 自己知道。
同样,我理解学习新东西的开销,这在您的案例中可能不会发生,但无论如何我想概述它以供将来参考和解决您的问题的独立解决方案。
什么是实现 @Async
方法的最佳方法,每 Y 次 milliseconds/seconds 执行 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
并使用用于速率限制的东西。
考虑到更多关注您的需求,让我把它放在 table 作为一个非常有效的选项,我在过去的类似情况下使用过计时器限制。
名为Throttler
的企业集成模式(EIP)可以完美解决这个限速问题。
Apache Camel Throttler implementation让你指定:
maximumRequestsPerPeriod
= 每个周期限制的最大请求数 在你的情况下 14timePeriodMillis
= 以毫秒为单位的时间段,在您的情况下节流器最多允许maximumRequestsPerPeriod
条消息 1000(顺便说一句,这是默认值)
这可以用 XML 或 Java 方式定义,它还提供异步非阻塞选项(如果电子邮件没有使其在本次迭代中安排它们在下一个可用时段发生) .
Spring Integration,提供 EIP 的 Spring 解决方案,应该也有 Throttler 选项可用,但我没有使用 Spring Integration 自己知道。
同样,我理解学习新东西的开销,这在您的案例中可能不会发生,但无论如何我想概述它以供将来参考和解决您的问题的独立解决方案。