UserTransaction PhaseListener ERRO JBAS010152

0 respostas
direisc

Eu estou usando JPA (Hibernate 4.*), JBOSS 7.1, PostgresSQL numa aplicação web "comum" utilizando Injeção de dependência e EntityManager.

porem para sanar o problema do Lazy, optamos por usar OpenSessionInView, porem utilizar o mesmo em filtros gera consultas ao banco de forma desnecessárias (para cada filtro ou ciclo ele acaba buscando no banco novamente, e mesmo que na mesma transação consome muito do nosso banco), a solução foi optar por PhaseListener, esse por sua vez em outra aplicação mais "simples" funcionou porem na nova estrutura da um certo problema:
JBAS010152: APPLICATION ERROR: transaction still active in request with status 0.
E isso ocorre em poucas telas do sistema, pelo que me parece acontece um loop no phaseListener entrando duas vezes no ciclo de vida (mandando e recebendo duas vezes). Houve umas tentativas para corrigir tal problema mas não funcionou, se possível gostaria de uma mãozinha... Segue o codigo do meu listener responsavel pelo ciclo das transações.
package br.salus.util;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.naming.InitialContext;
import javax.transaction.UserTransaction;

public class TransactionListener implements PhaseListener {
	private static final long serialVersionUID = 5110888317326015804L;

	private InitialContext ctx = null;

	private static final String USER_TRANSACTION_JNDI = "java:comp/UserTransaction";

	public TransactionListener() throws Exception {
		this.ctx = new InitialContext();
	}

	public void beforePhase(PhaseEvent phaseEvent) {
		PhaseId phaseId = phaseEvent.getPhaseId();
		if (phaseId == PhaseId.RESTORE_VIEW) {
			// handle transactions in a non-portal environment
			try {
				UserTransaction tx = (UserTransaction) ctx.lookup(USER_TRANSACTION_JNDI);
				tx.begin();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public void afterPhase(PhaseEvent phaseEvent) {
		PhaseId phaseId = phaseEvent.getPhaseId();
		boolean commitTran = phaseId == PhaseId.RENDER_RESPONSE;
		if(commitTran) {
			UserTransaction tx = null;
			boolean rollback = false;

			try {
				tx = (UserTransaction) ctx.lookup(USER_TRANSACTION_JNDI);
			} catch (Throwable t) {
				rollback = true;
				throw new RuntimeException(t);
			} finally {
				if (tx != null) {
					try {
						if (rollback) {
							tx.rollback();
						} else {
							tx.commit();
						}
					} catch (Exception e) {
						// if exceptions occur with transaction rollback and
						// committ...not a whole lot you can do about it
						e.printStackTrace();
					}
				}
			}
		}
	}

	@Override
	public PhaseId getPhaseId() {
		return PhaseId.ANY_PHASE;
	}
}
Não sei mais onde procurar para sanar esse problema.
Criado 25 de julho de 2013
Respostas 0
Participantes 1