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();
}
}
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. –
È 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" –