2011-11-03 16 views
7

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(); 
    } 

} 
+0

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. –

+0

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" –

Respuesta

9

JBoss AS 7.0.2 no soporta @Asynchronous por defecto. Tienes que activarlo. Si no está activado, no hay advertencia o mensaje de error, los métodos asíncronos simplemente se ejecutan de forma sincronizada.

Sí, eso es fácil de usar.

Para habilitar estas características en este producto supuestamente terminado y puesto en libertad *, debe ejecutar JBoss AS 7.0.2 con el "independiente-preview.xml", por ejemplo:

bin/standalone.sh --server-config=standalone-preview.xml 

o en AS 7.1 (beta) o posterior:

bin/standalone.sh --server-config=standalone-full.xml 

... que hace que se invoquen los métodos asincrónicos ... asincrónicamente.

  • (AS 7 cierto que no reclama derechos de Java EE 6 cumplimiento perfil completo, sino una advertencia sería agradable! O alguna documentación sobre los problemas conocidos/agujeros! Cualquier cosa menos de fallo no documentado en silencio ...)

Actualización: Como señaló garcia-jj, la eliminación de lite=true de standalone.xml también funcionará con los EJB asíncronos.

+0

Tenga en cuenta que en AS 7.1 "standalone-preview.xml" ahora es "standalone-full.xml" –

+0

Cómo habilitar el EJB asincrónico sin usando vista previa independiente? Gracias. –

+0

@ garcia-jj Ahora se llama standalone-full.xml en las versiones más recientes de JBoss AS 7, pero el punto es el mismo: debe ejecutar el servidor con un perfil que admita EJB asíncronas si desea utilizar EJB asíncronas. Si no te gusta, pregúntale a JBoss, porque esa parece ser la única opción que tienes ahora. –

Cuestiones relacionadas