web-dev-qa-db-ja.com

Spring @Async vs Callable Controller(非同期コントローラー、サーブレット3)を使用する場合

Callableを使用して、Springで@AsyncおよびServlet 3非同期要求の実装を使用する一般的な使用例を知りたいです。

私が理解しているように、@ Asyncはあらゆるメソッド(具体的には、すべてのサービスメソッド)を非同期的に実行するためのものです。

@Async
void doSomething(String s) {
// this will be executed asynchronously
}

およびCallableを返すコントローラー

  @RequestMapping("/view")
public Callable<String> callableWithView(final Model model) {
    return new Callable<String>() {
        @Override
        public String call() throws Exception {
            Thread.sleep(2000);
            model.addAttribute("foo", "bar");
            model.addAttribute("fruit", "Apple");
            return "views/html";
        }
    };
}

何を使用するかについて混乱しています。 Asynchronous servlet/controllerとspring @Asyncを一緒に使用するとどのような影響がありますか?

22
devThoughts

これ 投稿には探しているものの説明があります

抜粋:

場合によっては、バックグラウンドジョブが処理を完了する間、すぐにクライアントに戻ることができます。たとえば、電子メールの送信、データベースジョブの開始など、fire-and-forget Springの@Asyncサポートを使用して、またはSpring Integrationチャネルにイベントをポストすることで処理できるシナリオを表します。次に、クライアントが結果のクエリに使用できる確認IDを返します。

呼び出し可能な戻り型は、コントローラーメソッドを非同期にします。これは通常、長いポーリングのような状況で使用されます。詳細については、同じ著者による this 投稿を参照してください。

また、callableはRunnableの代替であり、ある意味で、結果を返し、チェック済み例外をスローできます。

メソッドがあるとします

public String aMethod(){

}

これは、単にCallableインターフェースを返すことで非同期にすることができます。

public Callable<String>  aMethod(){

}
19
shazinltc

callableインターフェースを使用して単一リクエストのパフォーマンスを改善することはできません。場合によっては、より多くのリクエストを取得するのに役立ちます。応答タイプが無効になる場合、呼び出し可能の代わりに実行可能を使用できるため、実行可能を使用すると、単一の要求の応答時間を改善できます。

0
poyraz