Nova transação usando seam

2 respostas
M

Pessoal,

O problema é o seguinte, estou utilizando o seam 2.1.2 e no meu negocio sempre que for lancada uma exceção no componente seam eu devo gravar um log no banco. So que devido ao seam gerenciar a transação, quando é lançada uma exception dentro do catch, a transação ja foi encerrada. Tem como eu gerenciar isso ou impedir de alguma forma que a transação somente seja encerrada apos a saida do método?

Entendo que no catch deva ser dado o rollback, mas encerrar a transação nao entendo porque, ela deveria ser encerrada na saida do método. Segue abaixo o erro que ocorre ao tentar gravar um registro na tabela de log:

11:29:43,976 WARN [JDBCExceptionReporter] SQL Error: 0, SQLState: null
11:29:43,976 ERROR [JDBCExceptionReporter] Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >; - nested throwable: (javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: -3f57fee5:946:4ae1aa0c:139 status: ActionStatus.ABORT_ONLY >)

OBS: nao tem problema de query nem de entidade pq o metodo funciona fora do catch.

segue trecho do codigo:

COMPONENT SEAM -----------------------------------
} catch (Exception e) {
			
			FacesMessages.instance().add(Token.ERRO_MSG_GENERICO + e.getCause());
			
			try{
				//gravando log da transação
				transacaoBean.gravaLog(transacao, StatusTransacao.ERRO, null);
			}catch(Exception eg){
				FacesMessages.instance().add(Token.ERRO_MSG_GENERICO_LOG + eg.getCause());
				return &quot;erro&quot;;
			}
}
MÉTODO QUE GRAVA O LOG: ------------------------------------
public void gravaLog(TransacaoNova transacaoNova, StatusTransacao eStatusTransacao, String msgErro) throws Exception {
		
		TransacaoNovaLog logTransacao = new TransacaoNovaLog();
		logTransacao.setDataLog(new Date());
		logTransacao.setTransacaoNova(transacaoNova);
		
		switch (eStatusTransacao){
			
			case CRIADA:
				logTransacao.setObservacao(&quot;transação criada com sucesso&quot;);
				logTransacao.setStatus('E');
				break;
			case PENDENTE:
				logTransacao.setObservacao(&quot;Falha ao enviar transação ao APLIC: &quot; + msgErro);
				logTransacao.setStatus('P');
				break;
			case SUBMETIDA:
				logTransacao.setObservacao(&quot;Transação submetida com sucesso&quot;);
				logTransacao.setStatus('S');
				break;
			case FINALIZADA:
				logTransacao.setObservacao(&quot;Transação finalizada com sucesso&quot;);
				logTransacao.setStatus('F');
				break;
			case CANCELADA:
				logTransacao.setObservacao(&quot;Transação cancelada&quot;);
				logTransacao.setStatus('C');
				break;
			case ERRO:
				logTransacao.setObservacao(&quot;falha na transação: &quot; + msgErro);
				logTransacao.setStatus('R');
				break;
		}
		
		em.persist(logTransacao);
		
	}

Obrigado!!

2 Respostas

F

Oi Malachai!

Vocë conseguiu resolver este problema?
Estou com um problema muito parecido com este e ainda não consegui achar uma solução.
Na verdade é um processo de exclusão, quando há alguma constraint eu faço uma exclusão lógica, tudo no mesmo método.
Quando a remoção dá erro logo depois tento fazer o update e estoura a exceção “Transaction is not active”

Se tiver alguma pista/dica…

[]'
Fábio Viana

J

Tambem estou com problema semelhante…

Criado 23 de outubro de 2009
Ultima resposta 25 de abr. de 2011
Respostas 2
Participantes 3