web-dev-qa-db-fra.com

Quand utiliser le contrôleur Spring @Async vs Callable (contrôleur async, servlet 3)

J'aimerais connaître le cas d'utilisation général de l'utilisation de l'application de requête asynchrone @Async et Servlet 3 dans Spring à l'aide de Callable.

Si j'ai bien compris, @Async sert à faire en sorte que toute méthode (en particulier toute méthode de service) s'exécute de manière asynchrone.

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

et tout contrôleur qui renvoie 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";
        }
    };
}

Je suis confus sur quoi utiliser quoi. Quel sera l’effet de l’utilisation conjointe d’un servlet/contrôleur asynchrone et d’un ressort @Async?

22
devThoughts

This post a l'explication de ce que vous recherchez

Extrait:

Dans certains cas, vous pouvez retourner immédiatement chez le client en tant que Le travail en arrière-plan termine le traitement. Par exemple, envoyer un email, lancer un travail de base de données, et les autres représentent fire-and-oublier scénarios qui peuvent être gérés avec le support @Async de Spring ou par publier un événement sur un canal Spring Integration, puis renvoyer un ID de confirmation que le client peut utiliser pour rechercher les résultats. 

Le type de retour appelable rend une méthode de contrôleur asynchrone. Ceci est généralement utilisé dans des situations comme les longues interrogations. Lisez this post du même auteur pour plus d'informations. 

Aussi appelable est une alternative à Runnable, dans le sens où il peut renvoyer des résultats et lancer des exceptions vérifiées.

Dis que tu as une méthode

public String aMethod(){

}

Cela peut être rendu asynchrone en renvoyant simplement une interface Callable.

public Callable<String>  aMethod(){

}
19
shazinltc

vous ne pouvez pas améliorer les performances d'une seule demande avec l'utilisation de l'interface Callable, cela permet de prendre plus de demandes dans certains cas. Si votre type de réponse est nul, vous pouvez utiliser runnable au lieu de callable. Ainsi, avec runnable, vous pouvez améliorer le temps de réponse d'une seule demande.

0
poyraz