0

@AsyncYミリ秒/秒ごとにX回実行されるメソッドを実装する最良の方法は何ですか。

私は、Spring の @Async アノテーションを使用して非同期的に実行している、1 秒あたり 14 通の E メールのみを送信するように Amazon SES によって設定された要件を持っていますが、私が知っているように、最大​​プールと最大キューサイズしか設定できず、レートは設定できません。

ここに私が持っているものがあります:

@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) {
    //...
}
4

2 に答える 2

1

既成概念にとらわれず、あなたの要件にもっと焦点を当てて、これを非常に効果的なオプションとしてテーブルに載せさせてください.

呼び出されるEnterprise Integration Pattern ( EIP ) はThrottler、このレート制限の問題を完全に解決できます。

Apache Camel Throttler 実装では、以下を指定できます。

  • maximumRequestsPerPeriod=あなたのケースでスロットリングする期間ごとのリクエストの最大数14
  • timePeriodMillis=ミリ秒単位の期間。スロットラーがmaximumRequestsPerPeriodケースで最大数のメッセージを許可します1000 (ちなみにこれがデフォルトです)

これは XML または Java のいずれかの方法で定義でき、非同期の非ブロック オプションも提供します (電子メールがこの繰り返しに間に合わない場合は、次の利用可能なスロットに発生するようにスケジュールします)。

EIP を提供する Spring ソリューションであるSpring Integrationにも Throttler オプションが用意されているはずですが、私自身は Spring Integration を使用して知りませんでした。

繰り返しますが、ここであなたのケースではおそらく起こらない何か新しいことを学ぶことのオーバーヘッドを理解していますが、将来の参照とあなたの問題に対するスタンドアロンの解決策のためにそれを概説したいと思いました.

于 2016-11-30T21:35:24.857 に答える