Metodi asincroni
A partire dalla versione Ejb 3.1 i session bean possono implementare metodi asincroni, ovvero metodi per i quali il Container restituisce il controllo al client prima dell'esecuzione del metodo sull'istanza del session bean. Questo è reso possibile dall'annotation Asynchronous
:
@Asynchronous
public Future processaOrdine(Ordine ordine){
...
}
L'oggetto Future
restituito è utilizzabile per verificare l'esito dell'operazione.
Esso ha il metodo isDone()
con cui verificare lo stato dell'operazione. Nel nostro esempio il client può informare l'utente del processo in corso e, ad intervalli di tempo, controllare lo stato dell'operazione. L'annotation Asynchronous
è applicabile anche a livello di classe rendendo cosi tutti i metodi di tipo asincrono.
Transazioni
Il metodo di un session bean è eseguito di default in una transazione, ma in alcune situazioni, come per il nostro bean Converter
, non desideriamo che venga aperta una transazione per motivi di efficienza. Per gestire gli aspetti transazionali di un metodo di un session bean sia fa quindi uso dell'annotation @TransactionAttribute
.
Su questa annotation possiamo impostare il valore del TransactionAttributeType
modificando il comportamento transazionale del metodo. Vediamo le possibili scelte.
Metodo | Descrizione |
---|---|
NotSupported |
Indica il non supporto della propria esecuzione in una transazione, il metodo non apre transazioni e se invocato in una transazione in corso ne provoca la sospensione per la durata del metodo stesso. |
Supports |
Indica il supporto alle transazioni, in questo caso il metodo non apre alcuna transazione ma partecipa ad una attività in corso. |
Required |
Comportamento di default, se vi è una transazione in corso si unisce ad essa altrimenti ne apre una propria. |
RequiresNew |
Il metodo apre sempre una nuova transazione propria che ha durata pari all'esecuzione del metodo. |
Mandatory |
Indica che il metodo deve sempre essere eseguito all'interno di una transazione, se questo non accade si verifica una condizione di errore. |
Never |
Marca un metodo come non eseguibile mai in un contesto transazionale, se si tenta di renderlo partecipe di una transazione si verifica un errore. |
Alla luce di quanto detto scegliamo di marcare i metodi del bean converter con Never
:
/**
* Session Bean implementation class ConverterBean
*/
@Stateless(name="ConverterBean", mappedName = "ConverterBean")
public class ConverterBean implements ConverterBeanRemote, ConverterBeanLocal {
/**
* Default constructor.
*/
public ConverterBean() {
// TODO Auto-generated constructor stub
}
@Override
@TransactionAttribute(TransactionAttributeType.NEVER)
public float celsiusToFahrenheit(float temperature) {
return temperature * 1.8f + 32;
}
@Override
@TransactionAttribute(TransactionAttributeType.NEVER)
public float fahrenheitToCelsius(float temperature) {
return (temperature - 32) / 1.8f;
}
}
Le possibili alternative per l'attributo dell'annotation @TransactionAttribute
sono quindi:
TransactionAttributeType.NOT_SUPPORTED
TransactionAttributeType.SUPPORTS
TransactionAttributeType.REQUIRED
TransactionAttributeType.REQUIRES_NEW
TransactionAttributeType.MANDATORY
TransactionAttributeType.NEVER
Abbiamo acquisito le conoscenze fondamentali per realizzare session bean stateless, nel successivo capitolo descriveremo i session bean di tipo stateful e come mantenere uno stato conversazionale con il client.