Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 6 di 68
  • livello ninja
Indice lezioni

Session Bean Stateless: metodi asincroni e transazioni

Come Implementare metodi asincroni e gestire le relazioni tra transazioni e metodi con i Session Bean Stateless,
Come Implementare metodi asincroni e gestire le relazioni tra transazioni e metodi con i Session Bean Stateless,
Link copiato negli appunti

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.

Ti consigliamo anche