Segunda SCBCD del día: Excepciones y Transacciones

(Imagen: Paul Cézanne - Mujer de Sombrero Verde)

FooBean and BarBean are both EJB 3.0 stateless session beans with container-managed transaction demarcation. All business methods in the two beans have transaction attribute REQUIRED. The business method foo in FooBean invokes the business method bar in BarBean.

Given:

10. public class BarBean{
11. public void bar(){
12. throw new EJBException("unexpected error...");
13. }
14. }

Which statement is true abput the result of this method invocation assuming execution reaches Line 12?

  • The container might roll back the transaction
  • The BarBean bean instance is in the ready state for the next invocation.
  • FooBean.foo method receives javax.ejb.EJBTransactionRolledBackException
  • FooBean.foo method receives javax.transaction.InvalidTransactionException

Antes de comenzar, debemos definir algunas cosas. Una excepción de sistema (System exception) incluye a java.lang.RuntimeException y sus sub-clases, como EJBException, lanzada en la línea 12. También se incluye java.rmi.RemoteException y sus sub-clases.

En los session beans (como el de la pregunta) cuando ocurre una excepción de sistema (como la de la pregunta) la instancia es desechada (de ahí inferimos que la segunda no va) y se lanza una RuntimeException. Si el cliente inicio la transacción (en nuestro caso, el cliente que inició la transacción es FooBean), que luego fue propagada al EJB (BarBean), el contenedor captura una excepción de sistema y la lanza como javax.ejb.EJBTransactionRolledbackException. EJBTransactionRolledbackException es una sub-clase de RuntimeException y le da al cliente la noticia de que ocurrió un rollback. Por ende, la respuesta correcta es la tercera opción.

Si el cliente no propagó la excepción al EJB, la excepción de sistema será capturada y lanzada como una EJBException. Pero ese no es el caso.

Pregunta tomada de ExamWorx

Publicar un comentario