Como ter controle sobre a transação - Seam/JTA

270 views
Skip to first unread message

Samer

unread,
Sep 2, 2010, 3:00:20 PM9/2/10
to javasf: JavaServer Faces Group
Pessoal, utilizo o Seam e todas as transações são gerenciados pelo
container (JTA), mas surgiu um caso de uso em que preciso ter maior
controle sobre as transações, pois preciso dar um commit() para que
seja atualizado no banco antes de finalizar o método.

Já tentei usar o getTransaction(), mas gera uma excessão dizendo não
ser possível, justamente por causa do JTA.

O mais próximo que consegui foi utilizar uma instancia da interface
Transaction (org.jboss.seam.transaction.Transaction), logo após o
entityManager.persist(obj), da seguinte maneira:
Transaction.instance().commit(), porém, ao fazer isso, o entityManager
não faz mais nada (parece que não existe mais transação, e mesmo que
eu force uma através do Transaction.instance().begin() nada acontece),
e eu preciso do EM várias vezes depois.

Lembrando que:
- não é EJB;
- não posso deixar de usar o JTA no restante da aplicação;
- meu escopo é o Conversation

Obrigado!!

Flávio Cysne Ferreira Gomes

unread,
Sep 4, 2010, 8:14:40 AM9/4/10
to jav...@googlegroups.com
Samer,

    o post abaixo talvez possa te ajudar.
    http://seamframework.org/Community/TomcatRESOURCELOCALMultipleDatasourcesExceptionInvokingGetTransaction

Espero ter ajudado.

Flávio Cysne


--
Você recebeu esta mensagem por que é membro do Google Group "Javasf".
http://groups.google.com/group/javasf

Conheça também:
 - Grupo Java Brazil em http://groups.google.com/group/thejavabrazil

thiago moraes

unread,
Sep 4, 2010, 8:45:55 AM9/4/10
to jav...@googlegroups.com
Não existe uma maneira no SEAM parecida com o BMT (Bean Managed Transaction) do Container EJB?


2010/9/4 Flávio Cysne Ferreira Gomes <flavi...@gmail.com>



--
Thiago Alves de Moraes
thiag...@gmail.com

Rodrigo

unread,
Sep 4, 2010, 10:47:08 AM9/4/10
to javasf: JavaServer Faces Group
Oi...

Já tentou setar o flushmode para MANUAL e depois quando quiser
sincronizar os
dados do entity manager com o banco vc dá um flush().... (como se
fosse o commit)

Talvez ajude.

Márcio Dantas

unread,
Sep 4, 2010, 1:22:11 PM9/4/10
to jav...@googlegroups.com
bom lembrar que dependendo como vc usa o seam, ele já abre uma transação antes de iniciar o seu método action e comita ao final da execução do método (o que pode interferir nas transações EJB).

de repente o que vc precisa é encapsular em um método (com transaction attribute REQUIRES_NEW) essa transação que vc tá querendo fazer programaticamente.

abs

Samer

unread,
Sep 10, 2010, 2:13:28 PM9/10/10
to javasf: JavaServer Faces Group
Pessoal, valeu pela ajuda, mas ainda não consegui resolver meu
problema.
Segui a dica do Márcio usando o REQUIRES_NEW no método que preciso
fazer commit, mas só funciona para o primeiro commit.

Tentei transformar o classe em um Bean gerenciavel utilizando a
anotação @TransactionManagement(TransactionManagementType.BEAN) mas
também não deu certo.

O fato é que preciso dar dois commit's e só o primeiro funciona, não
estou conseguindo entender porque, não sei se o problema é gerado pelo
primeiro commit e aí acontece alguma coisa com o entityManager e ele
não persiste.

Se alguém tiver paciência de olhar meu código o link é http://pastebin.com/kAM9BNk4
Tentei explicar bem o problema, se alguém puder ajudar agradeço.

Abraços!!

On 4 set, 14:22, Márcio Dantas <marci...@gmail.com> wrote:
> bom lembrar que dependendo como vc usa o seam, ele já abre uma transação
> antes de iniciar o seu método action e comita ao final da execução do método
> (o que pode interferir nas transações EJB).
>
> de repente o que vc precisa é encapsular em um método (com transaction
> attribute REQUIRES_NEW) essa transação que vc tá querendo fazer
> programaticamente.
>
> abs
>

Assis Júnior

unread,
Sep 10, 2010, 5:13:19 PM9/10/10
to jav...@googlegroups.com
tenta: http://pastebin.com/nxmQFMK1

Se não der certo tenta mudar o escopo do 2 componente para ScopeType.METHOD.
--
Atenciosamente,
Assis júnior
SCJP 5.0 Certified

Márcio Dantas

unread,
Sep 10, 2010, 5:45:57 PM9/10/10
to jav...@googlegroups.com
cara, dei uma olhada no código e tem uma parte estranha em relação as transações.
Você tá usando transações gerenciadas pelo container (CMT) em
  1. @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
  2.         public void saveInterFace(InterFace i, Register r) {
não precisa dentro do método recuperar a transação e trabalhar com ela programaticamente.
Vc deve tirar aquele código.

Outra coisa, tá parecendo que a classe ReadingDevicesAction não é um EJB... e @TransactionAttribute é uma anotação para o container EJB gerenciar a transação.

Posta também no site o código de quem está chamando ReadingDevicesAction.

abs

Samer

unread,
Sep 13, 2010, 3:30:47 PM9/13/10
to javasf: JavaServer Faces Group
Valeu pela força pessoal, ainda não deu certo, mas aos poucos to
entendendo como as coisas funcionam.

Meu código se encontra em http://pastebin.com/MsQUwZPY

Conforme a explicação do Assis, fiz uma nova classe (linha 66) para
utilizar o método saveInterFace(), anotando a classe com o escopo
METHOD e o método com
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW), que
segundo li tem o seguinte comportamento:

"Esse atributo é usado quando queremos garantir que determinado método
será executado em uma nova transação. Quando um método que possui este
atributo de transação é invocado, o container executa os seguintes
passos:

1. A transação atual é suspensa.
2. É criada uma nova transação
3. O método é invocado
4. O método invocado realiza o commit ou rollback desta nova
transação
5. A transação anterior é retomada"

Como o Márcio citou, estou usando CMT e agora anotei a classe
ReadingDevicesAction com @EJB, mas é importante ressaltar que utilizo
a estrutura WAR, é possível transformar uma classe num EJB nessa
estrutura WAR? Eu utilizo o Jboss AS 5.1.

O problema é que o quando chega dou um entityManager.flush() (linha
81), os dados não são comitados no banco, e toda a verificação se o
Comando foi inserido não funciona, ou seja, o containar acaba não
gerenciando a transação.

Abraços!



On 10 set, 18:45, Márcio Dantas <marci...@gmail.com> wrote:
> cara, dei uma olhada no código e tem uma parte estranha em relação as
> transações.
> Você tá usando transações gerenciadas pelo container (CMT) em
>
> 1. @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
> 2. public void saveInterFace(InterFace i, Register r) {
>
> não precisa dentro do método recuperar a transação e trabalhar com ela
> programaticamente.
> Vc deve tirar aquele código.
>
> Outra coisa, tá parecendo que a classe ReadingDevicesAction não é um EJB...
> e @TransactionAttribute é uma anotação para o container EJB gerenciar a
> transação.
>
> Posta também no site o código de quem está chamando ReadingDevicesAction.
>
> abs
>
> Em 10 de setembro de 2010 18:13, Assis Júnior <assisp...@gmail.com>escreveu:
>
> > tenta:http://pastebin.com/nxmQFMK1
>
> > <http://pastebin.com/nxmQFMK1>Se não der certo tenta mudar o escopo do 2
> > componente para ScopeType.METHOD.
>
> >> - Grupo Java Brazil emhttp://groups.google.com/group/thejavabrazil
Message has been deleted
Message has been deleted
Message has been deleted

Márcio Dantas

unread,
Sep 13, 2010, 5:43:50 PM9/13/10
to jav...@googlegroups.com
recomendo que vc use a abordagem sugerida pelo assis, que usa o controle transacional puro do seam.
Essa é a solução mais rápida pra vc.

Se quiser usar ejbs, é um pouco mais complicado porque vai ter que aprender um monte de coisas, tipo: como criar ejbs, como empacatar uma aplicação ear no seu ambiente de desenvolvimento e como usar seam + ejbs.

espero ter ajudado,
abs

Samer

unread,
Sep 14, 2010, 10:26:50 AM9/14/10
to javasf: JavaServer Faces Group
Acredite, eu tentei da maneira que o Assis sugeriu e os dados não vão
para o banco de maneira alguma.

On 13 set, 18:43, Márcio Dantas <marci...@gmail.com> wrote:
> recomendo que vc use a abordagem sugerida pelo assis, que usa o controle
> transacional puro do seam.
> Essa é a solução mais rápida pra vc.
>
> Se quiser usar ejbs, é um pouco mais complicado porque vai ter que aprender
> um monte de coisas, tipo: como criar ejbs, como empacatar uma aplicação ear
> no seu ambiente de desenvolvimento e como usar seam + ejbs.
>
> espero ter ajudado,
> abs
>
> Em 13 de setembro de 2010 16:30, Samer <samer.ja...@gmail.com> escreveu:
>
> > Valeu pela força pessoal, ainda não deu certo, mas aos poucos to
> > entendendo como as coisas funcionam.
>
> > Meu código se encontra emhttp://pastebin.com/MsQUwZPY

Márcio Dantas

unread,
Sep 14, 2010, 10:55:54 AM9/14/10
to jav...@googlegroups.com
vc fez as configurações pro seam gerenciar suas transações?

dá uma olhada no livro "seam in action" do Dan Allen. Tem uma parte só ensinando a fazer isso.
Tenho ele em pdf, dá uns 5mb. Qualquer coisa posso te mandar.

abs

Assis Júnior

unread,
Sep 14, 2010, 12:30:19 PM9/14/10
to jav...@googlegroups.com
Samer, vê se isso ajuda: http://pastebin.com/SB6mQFSQ

Vê isso no teu components.xml: <transaction:entity-transaction entity-manager="#{entityManager}" />
Vê isso no teu persistence.xml: <persistence-unit name="..." transaction-type="RESOURCE_LOCAL">

Assis Júnior

unread,
Sep 14, 2010, 12:30:40 PM9/14/10
to jav...@googlegroups.com
Se der certo posta ai como tu fez.

Samer

unread,
Sep 14, 2010, 1:12:39 PM9/14/10
to javasf: JavaServer Faces Group
Assis, no components.xml não tem e não aceita a tag
<transaction:entity-transaction> entity-manager="#{entityManager}" />

Mas usando essa configuração e tambem o transaction-
type="RESOURCE_LOCAL" no persistence.xml não irei deixar de utilizar o
JTA e assim terei que ficar gerenciando as transações no braço?

On 14 set, 13:30, Assis Júnior <assisp...@gmail.com> wrote:
> Samer, vê se isso ajuda:http://pastebin.com/SB6mQFSQ
>
> Vê isso no teu components.xml: <transaction:entity-transaction
> entity-manager="#{entityManager}" />
> Vê isso no teu persistence.xml: <persistence-unit name="..."
> transaction-type="RESOURCE_LOCAL">
>
> Em 14 de setembro de 2010 11:55, Márcio Dantas <marci...@gmail.com>escreveu:
>
>
>
> > vc fez as configurações pro seam gerenciar suas transações?
>
> > dá uma olhada no livro "seam in action" do Dan Allen. Tem uma parte só
> > ensinando a fazer isso.
> > Tenho ele em pdf, dá uns 5mb. Qualquer coisa posso te mandar.
>
> > abs
>
Reply all
Reply to author
Forward
0 new messages