Estoy luchando para descubrir por qué un método @Asynchronous en mi EJB no se está invocando asíncronamente. Me estoy ejecutando en JBoss AS 7 usando CDI (con beans.xml) en un proyecto JSF2 con un empaque simple .war producido por Maven.@Asynchronous no resulta en la invocación asincrónica del método EJB en JBossAS7
El EJB se presenta en formato .war junto con los beans administrados JSF2 que interactúan con él. Es un @Stateless EJB simple. Se usa al inyectarlo (a través de @Inject) en un bean gestionado JSF2 que invoca su método @Asynchronous.
En lugar de que la invocación del método @Asynchronous devuelva un Future de forma inmediata, se ejecuta de forma síncrona como si se tratara de una llamada directa no procesada ordinaria. Esto es cierto si utilizo una vista local sin interfaz o una interfaz comercial local para invocar el EJB.
¿@Asynchronous solo es compatible con @Remote beans? Si es así, ¿puede funcionar dentro de un paquete .war o tengo que empaquetar un jarrón EJB en un EAR solo para obtener esta función?
código simplificado por el bien de ejemplo, con cada clase en el mismo paquete en un .war:
public interface SomeEJB {
public Future<Void> doSomething();
}
@Stateless
@Local(SomeEJB.class)
public class SomeEJBImpl implements SomeEJB {
@Asynchronous
@Override
public Future<Void> doSomething() {
// Spend a while doing work
// then:
return new AsyncResult<Void>(null);
}
}
@Named
@RequestScoped
public class JSFBean {
@Inject private transient SomeEJB someEJB;
private Future<Void> progress;
// Called from JSF2, starts work and re-displays page
public String startWorkAction() {
// This call SHOULD return a Future immediately. Instead it blocks
// until doWork() completes.
progress = someEJB.doWork();
}
public Boolean isDone() {
return progress != null && progress.isDone();
}
}
Parece que @Asynchronous no está implementado en JBoss AS 7 (a partir de 7.0.2). Una vez más, las señales de las implementaciones de Java EE 6 aún están defectuosas e incompletas años después del lanzamiento de la especificación. Suspiro. Sería bueno emitir una advertencia o algo que NO FALLE EN SILENCIO. –
Puede habilitar algunas características de EJB3.1 por defecto con la configuración de vista previa independiente en AS 7.0.2. Invocar como: "bin/standalone.sh --server-config = standalone-preview.xml" –