2011-11-03 8 views
7

Non riesco a capire perché un metodo @Asynchronous nel mio EJB non venga effettivamente richiamato in modo asincrono. Sono in esecuzione su JBoss AS 7 utilizzando CDI (con bean.xml) in un progetto JSF2 con un semplice packaging .war prodotto da Maven.@Asynchronous non risulta in invocazione asincrona del metodo EJB in JBossAS7

L'EJB è contenuto in un file .war insieme ai bean gestiti JSF2 che interagiscono con esso. È un semplice EJB @Stateless. Viene utilizzato iniettandolo (tramite @Inject) in un bean gestito JSF2 che richiama il suo metodo @Asynchronous.

Anziché l'invocazione del metodo @Asynchronous che restituisce immediatamente un Futuro, viene eseguita in modo sincrono come se fosse una normale chiamata diretta non in attesa. Questo è vero se utilizzo una vista no-interface locale o un'interfaccia di business locale per richiamare l'EJB.

@Asynchronous è supportato solo per i bean @Remote? In tal caso, può funzionare con l'imballaggio .war o devo confezionare un vaso EJB in un EAR solo per ottenere questa funzione?

codice semplificato per l'amor di esempio, con ogni classe nella stessa confezione in 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

Comincia a sembrare @Asynchronous non è implementato in JBoss AS 7 (come da 7.0.2) - ancora una volta, le implementazioni di Java EE 6 sono ancora buggate e incomplete anni dopo il rilascio della specifica. Sospiro. Sarebbe bello rilasciare un avvertimento o qualcosa di non SILENZIO FAIL. –

+0

È possibile abilitare alcune funzionalità EJB3.1 off-by-default con la configurazione di anteprima standalone in AS 7.0.2. Richiamare come: "bin/standalone.sh --server-config = standalone-preview.xml" –

risposta

9

JBoss AS 7.0.2 non supporta @Asynchronous per impostazione predefinita. Devi accenderlo. Se non è attivato non ci sono avvisi o messaggi di errore, i metodi asincroni vengono semplicemente eseguiti in modo sincrono.

Sì, è facile da usare.

Per abilitare queste funzioni in questo prodotto apparentemente finito e rilasciato *, è necessario eseguire JBoss AS 7.0.2 con il "standalone-preview.xml", ad esempio:

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

o in AS 7.1 (beta) o successivi:

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

... che ottiene i metodi asincroni essere addotta ... asincrono.

  • (Certo AS 7 non ha la pretesa di Java EE 6 completa conformità profilo, ma un avvertimento sarebbe bello! O qualche documentazione sui problemi noti/fori! Tutt'altro che silenziosa guasto non documentata ...)

Aggiornamento: Come notato da garcia-jj, rimuovendo lite=true da standalone.xml riceverà anche asincrona EJB di lavoro.

+0

Si noti che in AS 7.1 "standalone-preview.xml" è ora "standalone-full.xml" –

+0

Come abilitare EJB asincrono senza usando l'anteprima standalone? Grazie. –

+0

@ garcia-jj Ora è chiamato standalone-full.xml nelle versioni più recenti di JBoss AS 7, ma il punto è lo stesso: è necessario eseguire il server con un profilo che supporti EJB asincroni se si desidera utilizzare EJB asincroni. Se non ti piace, lamentati con JBoss, perché sembra essere l'unica opzione che hai adesso. –

Problemi correlati