2012-01-18 25 views
5

Tengo un EJB A que invoca EJB B. La IU no debería esperar más de 30 segundos para obtener una respuesta. Si faltan algunos datos, debería devolver una respuesta parcial.Realizar llamada EJB con tiempo de espera

¿Cómo puedo definir un tiempo de espera (límite de tiempo de 30 segundos) en EJB B?

Puedo definir EJB B como Asynchronous que devuelve Future, y luego Future.get(30, TimeUnit.SECONDS). ¿Pero es la mejor solución?

gracias

P. S. Yo uso glassfish 3.1

Respuesta

0

Para configurar el tiempo de espera para un bean que se aplica a todos sus métodos, debe configurar el atributo cmt-timeout-in-seconds en glassfish-ejb-jar.xml.

Este valor de tiempo de espera es utilizado por todos los métodos del bean que inicia una nueva transacción, no aplicable cuando se unen a otra transacción en curso.

También puede consultar este link para obtener más información sobre el tiempo de espera.

2

No hay forma de interrumpir un EJB objetivo. La única opción real es que el EJB objetivo cooperativamente compruebe periódicamente si ha excedido el tiempo de respuesta objetivo deseado.

Incluso si usa @Asynchronous y Future.get veces, simplemente ha desbloqueado al cliente de esperar el resultado; el EJB objetivo continuará ejecutando y consumiendo recursos. Sin embargo, con los métodos asíncronos, tiene el beneficio de una cancelación cooperativa incorporada usando Future.cancel y SessionContext.wasCancelCalled.

+0

No quiero interrumpir EJB. La idea era devolver la respuesta (o "error de tiempo de espera") a la IU después de 30 segundos. – lili

+2

Claro, pero el tiempo de espera de la interfaz sin agotar el tiempo de espera parece imprudente. Eventualmente, sus hilos de back-end serán consumidos y sus hilos de front-end tendrán que esperar de todos modos. Dado lo que ha dicho, usar '@ Asynchronous' es probablemente lo mejor. –

5

Sugeriría utilizar el tiempo de espera de la transacción para esto.

No creo que haya una forma estándar de configurarlo, por lo que dependería del servidor de la aplicación. Supongo que quieres configurarlo específicamente por clase o método.

Para WebLogic puede especificarlo en "weblogic-ejb-jar.xml" en el "descriptor de transacción" o usar la anotación "@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

Para JBoss AS puede establecer el tiempo de espera de transacción utilizando la anotación "@TransactionTimeout" o en "jboss.xml".

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

estoy seguro de que hay opciones de configuración similares en cada servidor de aplicaciones.

Cuestiones relacionadas