2011-06-05 8 views
5

tengo una transacción gestionada @StatelessEJB usando contenedor. ¿Hay alguna manera de acceder al "estado" de javax.transaction.UserTransaction? Es decir, llamando al UserTransaction.getStatus() dentro de los métodos de bean?Acceso situación de la operación en los granos de contenedores gestionado

Sé que el acceso a UserTransaction está prohibido en los beans administrados por contenedor, pero me gustaría saber si hay otra forma de acceder al método getStatus()?

Respuesta

2

No creo que haya entendido la responsabilidad de la clase UserTransaction. No existe para proporcionarle acceso a la transacción actual en ejecución. Se usa para iniciar cualquier comunicación con el Administrador de transacciones del contenedor, especialmente para las transacciones iniciadas y finalizadas administradas por el bean; es por eso que no debe acceder desde un contexto de transacción administrado por contenedor.

Me gustaría saber, ¿hay alguna otra forma de acceder al método getStatus()?

No, uno no puede, al menos no usar las API EJB. Uno puede, como máximo, usar interceptores EJB para registrar el hecho de que se han invocado los métodos EJB. Tendrá que ser bastante inteligente para rastrear el estado de las llamadas y luego inferir el estado de la transacción.

Si no son reacios a utilizar las API específicas de contenedores, es posible acceder a la transacción subyacente. Sea prevenido, ya que el siguiente enfoque podría no funcionar si no sabe cómo usarlo, o si el contenedor le prohíbe hacerlo. El mecanismo que se describe a continuación es cómo SpringFramework obtiene acceso al administrador de transacciones JTA y puede crear y gestionar transacciones.

En el caso de Oracle WebLogic, se puede obtener una referencia a la TranactionHelper class, que puede ser utilizado para obtener una referencia a la current transaction asociado con el hilo de rosca, cuyo status puede ser obtenida. Apuntaría al sources of the Transaction SPI for JTA in the Spring framework, si necesita seguir este curso para otros servidores de aplicaciones.

10

Si sólo necesita saber si la transacción se marca para la reversión, a continuación, utilizar EJBContext.getRollbackOnly. De lo contrario, la JTA 1.1, puede utilizar TransactionSynchronizationRegistry:

TransactionSynchronizationRegistry tsr = (TransactionSynchronizationRegistry) 
    new InitialContext().lookup("java:comp/TransactionSynchronizationRegistry"); 
int status = tsr.getTransactionStatus() 
+0

Sólo para complementar, valores de estado de transacción se definen en [la clase de estado] (https://docs.oracle.com/javaee/6/api/javax /transaction/Status.html). Para resumir: 'STATUS_ACTIVE = 0; STATUS_MARKED_ROLLBACK = 1; STATUS_PREPARED = 2; STATUS_COMMITTED = 3; STATUS_ROLLEDBACK = 4; STATUS_UNKNOWN = 5; STATUS_NO_TRANSACTION = 6; STATUS_PREPARING = 7; STATUS_COMMITTING = 8; STATUS_ROLLING_BACK = 9; ' –

Cuestiones relacionadas