requestmapping - spring java
Cuándo usar el controlador Spring @Async vs Callable(controlador asíncrono, servlet 3) (2)
Me gustaría saber el caso de uso general del uso de la implementación asíncrona de @Async y Servlet 3 en Spring usando Callable.
Según tengo entendido, @Async es para hacer que cualquier método (específicamente, cualquier método de servicio) se ejecute de forma asíncrona.
@Async
void doSomething(String s) {
// this will be executed asynchronously
}
y cualquier controlador que devuelva 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";
}
};
}
Estoy confundido sobre qué uso. ¿Cuál será el efecto de usar el servlet / controlador asíncrono y con el resorte @Async juntos?
no se puede mejorar el rendimiento de una sola solicitud con el uso de la interfaz invocable, en algunos casos ayuda tomar más solicitudes. Si su tipo de respuesta sería nulo, puede usar runnable en lugar de llamable, así que con runnable puede mejorar el tiempo de respuesta de una sola solicitud.
This post tiene explicación para lo que buscas.
Extracto:
En algunos casos, puede regresar al cliente inmediatamente mientras un trabajo en segundo plano completa el procesamiento. Por ejemplo, enviar un correo electrónico, iniciar un trabajo de base de datos, y otros representan escenarios de fuego y olvido que pueden manejarse con el soporte de
@Async
de Spring o publicando un evento en un canal de Spring Integration y luego devolviendo una identificación de confirmación que el cliente puede usar para consultar los resultados.
El tipo de retorno invocable hace que un método de controlador sea asíncrono. Esto se utiliza generalmente en situaciones como el sondeo largo. Lea this publicación del mismo autor para más información.
También puede llamarse una alternativa para Runnable, en el sentido de que puede devolver resultados y lanzar excepciones comprobadas.
Di que tienes un método
public String aMethod(){
}
Esto puede hacerse asíncrono simplemente devolviendo una interfaz invocable.
public Callable<String> aMethod(){
}