2012-01-18 8 views
5

Ho un EJB A che richiama EJB B. L'interfaccia utente non dovrebbe attendere più di 30 secondi per una risposta. Se mancano alcuni dati, dovrebbe restituire una risposta parziale.Effettuare chiamate EJB con timeout

Come è possibile definire un timeout (limite di tempo di 30 secondi) su EJB B?

Posso definire EJB B come Asynchronous che restituisce Future e quindi fare Future.get(30, TimeUnit.SECONDS). Ma è la soluzione migliore?

grazie

P.S. Uso Glassfish 3.1

risposta

0

Per configurare il timeout per un bean che si applica a tutti i suoi metodi, è necessario configurare l'attributo cmt-timeout-in-seconds in glassfish-ejb-jar.xml.

Questo valore di timeout viene utilizzato da tutti i metodi del bean che avvia una nuova transazione, non applicabile quando si uniscono ad altre transazioni in corso.

Inoltre, è possibile fare riferimento a questo link per ulteriori dettagli su timeout.

2

Non c'è modo di interrompere un EJB di destinazione. L'unica opzione reale è che il bean target possa cooperativamente e periodicamente verificare se ha superato il tempo di risposta previsto.

Anche se si utilizza @Asynchronous e Future.get volte, è stato semplicemente sbloccato il client dall'attesa del risultato; il bean target continuerà a eseguire e consumare risorse. Tuttavia, con i metodi asincroni, si ha il vantaggio di una cancellazione cooperativa incorporata utilizzando Future.cancel e SessionContext.wasCancelCalled.

+0

Non intendo interrompere EJB. L'idea era di restituire la risposta (o "errore di timeout") all'interfaccia utente dopo 30 secondi. – lili

+2

Certo, ma il time-out del front-end senza ritardi sul back-end sembra poco saggio. Alla fine, i thread back-end verranno consumati e i thread front-end dovranno attendere comunque. Dato quello che hai detto, usare '@ Asynchronous' è probabilmente il migliore. –

5

Suggerirei di utilizzare il timeout della transazione per questo.

Non penso che ci sia un modo standard di configurarlo in modo che dipenda dal server delle applicazioni. Presumo che tu voglia impostare in modo specifico per classe o metodo.

Per WebLogic è possibile specificarlo in "weblogic-ejb-jar.xml" nel "transaction-descriptor" o utilizzare l'annotazione "@TransactionTimeoutSeconds".

http://docs.oracle.com/cd/E12839_01/web.1111/e13719/ejb_jar_ref.htm#i1506703

http://docs.oracle.com/cd/E21764_01/web.1111/e13720/annotations.htm#i1438354

Per JBoss come si potrebbe impostare il timeout transazione utilizzando l'annotazione "@TransactionTimeout" o in "jboss.xml".

https://community.jboss.org/wiki/TransactionTimeout

io sono sicuro che ci sono simili opzioni di configurazione in tutti i server applicazioni.