| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 17:05:56
|
lavh
GUJ Master
Membro desde: 30/07/2006 16:09:55
Mensagens: 1311
Offline
|
Diz a lenda que em um contexto transacional, uma mensagem JMS só é enviada após o commit da transação corrente.
Pois bem, nenhuma versão do Jboss 4.x.x faz isso e eu não encontrei nada na spec do JMS dizendo que é esse o comportamento, então já estava me convencendo que isso é realmente um mito.
Porém, lendo o artigo do Guerra na Mundo Java deste mês, novamente ele tocou no assunto dizendo que o comportamento esperado é realmente só enviar a mensagem após o commit da transação.
Então, isso é mito ou verdade?
Se é verdade, em que app server isso acontece?
No JBoss 4.x.x isso definitivamente não acontece, e inclusive já veio até consultor da Jboss aqui tentar fazer isso funcionar e nada.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 18/12/2009 17:36:13
|
sergiotaborda
GUJ Expert
![[Avatar]](/images/avatar/b4a0e0fbaa9f16d8947c49f4e610b549.png)
Membro desde: 22/03/2005 20:57:48
Mensagens: 3433
Offline
|
lavh wrote:Diz a lenda que em um contexto transacional, uma mensagem JMS só é enviada após o commit da transação corrente.
.
Não. O que acontece é que a mensagem só é aknowledge quando a transação comita. A mensagem é enviada normalmente. (liás, se não fosse não teria fluxo de informação dentro da transação)
P.S. É uma missconception comum achar que só manda quando comita.
This message was edited 1 time. Last update was at 18/12/2009 17:39:16
|
Criando sua própria API de Validação
Blog do MiddleHeaven |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 11:12:44
|
Rubem Azenha
GUJ Master
![[Avatar]](/images/avatar/cb953f6ca5923f7517125db46ed1293d.jpg)
Membro desde: 28/06/2004 00:10:43
Mensagens: 1933
Localização: São Paulo, SP
Offline
|
O que eu já vi é um MDB usando a mesma transação do Session Bean que o chamou, mas isso é através de 2PC.
Se não me engano, o antigo BES (Borland Enterprise Server) fazia isso automaticamente quando o tipo de transação do MDB era required (e não requires new) e estivesse configurado o 2PC.
|
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 13:23:22
|
Will_HRock
JavaGuru
Membro desde: 11/04/2009 20:40:23
Mensagens: 211
Offline
|
O que está acontecendo no JBoss aí é que a mensagem está sendo entregue ao servidor antes do commit ou o MDB processa a mensagem antes do commit?
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 13:55:08
|
lavh
GUJ Master
Membro desde: 30/07/2006 16:09:55
Mensagens: 1311
Offline
|
Will_HRock wrote:O que está acontecendo no JBoss aí é que a mensagem está sendo entregue ao servidor antes do commit ou o MDB processa a mensagem antes do commit?
O MDB processa a mensagem antes do commit.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 14:31:34
|
Will_HRock
JavaGuru
Membro desde: 11/04/2009 20:40:23
Mensagens: 211
Offline
|
Estranho, pelo que eu sei isso não deveria acontecer, quer dizer que se a transação der um rollback depois de enviar a mensagem, a mensagem será enviada e processada mesmo assim ? No JBoss eu não sei como funciona mas no Glassfish isso não acontece.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 14:34:51
|
Rubem Azenha
GUJ Master
![[Avatar]](/images/avatar/cb953f6ca5923f7517125db46ed1293d.jpg)
Membro desde: 28/06/2004 00:10:43
Mensagens: 1933
Localização: São Paulo, SP
Offline
|
Só para ter certeza que eu não entendi errado:
Você quer que um Session Bean com transação aberta mande uma mensagem para uma fila JMS (sendo que tem um MDB escutando essa fila JMS) e essa mensagem seja enviada apenas quando a transação for commitada?
Nunca ouvi falar nisso não, será que não da pra fazer isso com AOP?
Ou, no pior dos casos, cria um Session Bean com transação requresNew, coloca sua lógica lá, e coloca o código de chamar esse Session Bean + código de mandar mensagem JMS dentro de outro Session Bean com transação required.
|
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/12/2009 14:47:03
|
Will_HRock
JavaGuru
Membro desde: 11/04/2009 20:40:23
Mensagens: 211
Offline
|
Seria isso sim, imagine que o MDB faz uma modificação em uma BD, e após isso a transação do Session Bean que enviou uma mensagem para essa fila, acontece um rollback? Os dados no banco de dados ficariam inconsistentes. Se a mensagem que o MDB processa realmente acontecer na hora que o Bean envia essa mensagem para a fila, poderia então ser feito um request/reply(com QueueReceiver.receive), coisa que só é possível se o bean não estiver usando transação.
This message was edited 2 times. Last update was at 21/12/2009 14:52:29
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/12/2009 11:37:01
|
Will_HRock
JavaGuru
Membro desde: 11/04/2009 20:40:23
Mensagens: 211
Offline
|
Olha essa parte do ejbCore que fala sobre transações e JMS:
"The Bean Provider should not make use of the JMS request/reply paradigm(sending of a JMS message, followed by the synchronous receipt of a reply to that message)within a single transaction. Because a JMS message is typically not delivered to its final destination until the transaction commits, the receipt of the reply within the same transaction will not take place."
This message was edited 1 time. Last update was at 23/12/2009 11:39:43
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/12/2009 13:46:03
|
clone_zealot
JavaEvangelist
Membro desde: 21/11/2004 16:40:00
Mensagens: 424
Offline
|
Texto interessante que recebi hoje (via RSS) da JBoss:
http://www.odi.ch/prog/jms-tx.php
|
"Não amo a espada por sua agudez,
não amo a flecha por sua rapidez,
não amo o homem por sua glória,
amo sim, tudo o que eles defendem"
Faramir, Príncipe de Ithilien |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 23/12/2009 16:17:15
|
Will_HRock
JavaGuru
Membro desde: 11/04/2009 20:40:23
Mensagens: 211
Offline
|
Exatamente, e como fala nesse artigo: "Using JTA means that messages you send from a session bean get really sent only with the commit (along with your DB changes etc.), and are discarded if you rollback."
Lavh, verifica se a criação da Connection e Session estão sendo feitas dento do contexto da transação que envia a mensagem(e não em um @PostConstruct, por exemplo).
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 21/01/2010 17:37:23
|
Sefo
JavaChild
![[Avatar]](/images/avatar/359499f804ea7988921bf86c9377fb95.jpg)
Membro desde: 18/08/2006 10:02:28
Mensagens: 102
Offline
|
Olá a todos.
Estamos com uma aplicação em fase final e só agora nos deparamos com esse probelma.
De um lado criamos um lote, salvamos ele no banco e enviamos uma mensagem JMS com o valor do lote gerado.
Quando meu MDB tenta processa o lote, ele ainda não foi "commitado" no banco e portanto não é encontrado.
O servidor usado é o JBoss 4.2.x e nessa altura do campeonato não é possível troca-lo.
Gostaria de saber se alguem tem uma dica/ideia de como resolver esse problema.
Não. O que acontece é que a mensagem só é aknowledge quando a transação comita. A mensagem é enviada normalmente. (liás, se não fosse não teria fluxo de informação dentro da transação)
P.S. É uma missconception comum achar que só manda quando comita.
Sergio, se importaria de me explicar melhor o que vc quis dizer nessas partes destacadas.
Grato.
|
NY GIANTS!!!!
WAR BIG BLUES!!!!
 |
|
|
 |
|
|