java - ejemplo - Tarea de primavera 3.2 @Async con tipo de retorno de futuro
spring boot asynchronous request (3)
Echa un vistazo a esta entrada de blog .
El uso de @Async
permite ejecutar un cálculo de forma asíncrona. Esto significa que si se llama (en un bean administrado por Spring), el control se devuelve inmediatamente a la persona que llama y el código en el método se ejecuta en otro hilo. La persona que llama recibe un objeto Future
que está vinculado al cálculo en ejecución y puede usarlo para verificar si el cálculo se está ejecutando y / o esperar el resultado.
Crear un método así es simple. @Async
con @Async
y envuelva el resultado en AsyncResult
, como se muestra en la publicación del blog.
Estoy tratando de implementar una tarea Spring @Async que tiene un tipo de Futuro de retorno, pero realmente no puedo averiguar cómo hacerlo correctamente.
- ¿Qué ganaré al hacerlo? ¿Tendré ahora un control sobre mi tarea para poder detenerlo y ejecutarlo?
- ¿Hay alguna implementación de referencia sobre cómo puedo hacerlo? springsource no proporciona ninguna.
EDITAR
De fuente de primavera y manual de referencia de primavera:
Incluso los métodos que devuelven un valor pueden invocarse de forma asíncrona. Sin embargo, se requiere que tales métodos tengan un valor de retorno tecleado en el Futuro. Esto aún proporciona el beneficio de la ejecución asíncrona para que la persona que llama pueda realizar otras tareas antes de llamar a get () en ese Futuro.
Y el da un ejemplo así:
@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}
¿Cómo implementar esto correctamente?
Echa un vistazo a esta entrada de blog
La configuración importante es:
- @Async en el método de bean administrado en primavera
Habilite async en spring config xml definiendo:
<!-- Enables the detection of @Async and @Scheduled annotations on any Spring-managed object. --> <task:annotation-driven/>
SimpleAsyncTaskExecutor se utilizará de forma predeterminada.
Envuelve la respuesta en un objeto Futuro <>
Ejemplo:
@Async
public Future<PublishAndReturnDocumentResult> generateDocument(FooBarBean bean) {
//do some logic
return new AsyncResult<PublishAndReturnDocumentResult>(result);
}
A continuación, puede verificar si el resultado está hecho (result.isDone ()) o esperar para obtener la respuesta result.get ()
El ExecutorService puede programar Callable y devolver un objeto Future. El futuro es un marcador de posición que contiene el resultado una vez que está disponible. Le permite verificar si el resultado está allí, cancelar la tarea o bloquear y esperar los resultados. El futuro es útil solo cuando espera algún objeto / valor de la tarea.
La forma correcta de hacer la llamada del futuro es:
Future<Integer> futureEvenNumber = executorService.submit(new NextEvenNumberFinder(10000));
// Do something.
try {
Integer nextEvenNumber = futureEvenNumber.get();
} catch (ExecutionException e) {
System.err.println("NextEvenNumberFinder threw exception: " + e.getCause());
}
La clase NextEvenNumberFinder:
public class NextEvenNumberFinder implements Callable<Integer> {
private int number;
public NextEvenNumberFinder(int number) { this.number = number; }
@Override
public Integer call() throws Exception {
for (;;)
if (isEvenNumber(++number)) return number;
}
}
Manual de referencia de integración de Spring: http://static.springsource.org/spring-integration/reference/htmlsingle/