SCBCD del Día: Explicit Transaction Management

(Imagen: Henri Matisse - Lanzador de cuchillos)

  • Which is the correct way of declaring bean-managed transaction demarcation for an EJB 3.0 message-driven bean?

@MessageDriven
public class MyMessageBean implements MessageListener, UserTransaction {

@MessageDriven
@TransactionManagement (TransactionManagementType.BEAN)
public class MyMessageBean implements MessageListener{

@MessageDriven
public class MyMessageBean implements MessageListener{
@TransactionManagement(TransactionManagementType.BEAN)
public void onMessage(Message message) {...}

@MessageDriven (transactionManagement = TransactionManagementType.BEAN)
public class MyMessageBean implements MessageListener{

Los EJB's pueden también manejar transacciones de manera explícita. Sólamante los session beans y los message-driven beans que definan un javax.ejb.TransactionManagementType como Bean mediante la anotación @javax.ejb.TransactionManagement pueden administrar sus propias transacciones. A los EJB's que administran sus propias transacciones se les llama beans BMT (bean-managed transaction). Los beans entity no pueden ser BMT. Los BMT's no declaran atributos de transacción para sus métodos. Aquí un ejemplito:

@Stateless
@TransactionManagement (TransactionManagerType.BEAN)
public class HypotheticalBean implements HypotheticalLocal{ ... }

Que cómo verán, es similar a la segunda alternativa que es nuestra respuesta.

Para administrar sus propias transacciones , un EJB necesita obtener un objeto UserTransaction. Éste se obtiene mediante EJBContext y inyectándolo con @Resource.

Pregunta tomada de ExamWorx

Publicar un comentario