JTA JMS transaction

18 views
Skip to first unread message

yosri naghmouchi

unread,
Sep 21, 2011, 5:40:33 AM9/21/11
to TeeJUG
Bonjours tous le monde ,
j ai un problème avec les transactions enfaîte mon projet est sur
plusieurs modules chacun a une couche service et une couche manager
et une sous couche qui a la même architecture service / manager qui
représente un socle technique tous est bien cablé derrière avec spring
2.5 ,l environnement impose que tous est transactionnel voila voila.
passons au détail du probleme :
je reçois dans mon service un message xml a travers une queue jms
plus précisément j overide la méthode onMessage() ...et du coup je
crée ma 1er transaction T1 j appel mon manager et je exécute mon code
métier et puis une exception qui claque et puis elle remonte au
service ou je la catch() et puis j appel un 2em manger dans le bloc de
catch et je crée une 2em transaction T2 j explique :j ai définis un
2em txManager au niveau de la conf spring juste pour que la T2 soit
indépendante de T1 "propagation="REQUIRES_NEW"". dans T2 le manager
appel un MessageProducer pour envoyer un msg dans la queue et a la fin
JTA se trouve avec 2 transaction T1 en état suspendu et T2 et juste
apres je throw un RuntimeException histoire pour rollback de la T1 et
committer la T2 alors que la JTA rollback les 2 transaction c est pas
ce que j attendais comme résultat et c'est hallucinant . est ce que il
y a quelqu’un qui pourrais me donner des pistes sur ce problème je
suis prés a toutes les questions Merci d avance.

bacem riahi

unread,
Sep 21, 2011, 6:38:50 AM9/21/11
to tee...@googlegroups.com
tu fais comment pour gérer ouvrir tes transactions ? c'est avec l'annotation @Transactional ?
si oui quels attributs tu pércises ? (à part la propagation bien)


--
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes TeeJUG.
Pour envoyer un message à ce groupe, adressez un e-mail à tee...@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse teejug+un...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : http://groups.google.com/group/teejug?hl=fr


bacem riahi

unread,
Sep 21, 2011, 6:50:09 AM9/21/11
to tee...@googlegroups.com
Salem,
à la limite si tu n'as pas specifié la façon de rollbacker dans ta conf tu pourras ajouter cette ligne au catch de ton exception (1ere transaction):
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

yosri naghmouchi

unread,
Sep 21, 2011, 8:52:10 AM9/21/11
to TeeJUG
Salem,
pour la T1 j ai pas la main dessus elle est configurer dans une couche
au dessous du module que je suis entrain de développer par-contre
voici ma une parti de ma conf pour la T2
<tx:advice id="dumpTxAdvice" transaction-
manager="transactionManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="read*" read-only="true" />
<tx:method name="find*" read-only="true" />
<tx:method name="*" propagation="MANDATORY" />
<tx:method name="dump*" propagation="REQUIRES_NEW" />
</tx:attributes>
</tx:advice>

<aop:config>
<aop:pointcut id="dumpMethods"
expression="execution(* com..kor..*Manager.*(..))" />
<aop:advisor advice-ref="dumpTxAdvice" pointcut-ref="dumpMethods" />
</aop:config>

la methode que j intercepte via Aop c'est le dumpReportException() et
puis j ai configurer dans mon fichier log.xml
<category
name="org.springframework.transaction.PlatformTransactionManager">
<priority value="DEBUG" />
</category>
<category name="org.springframework.transaction.jta">
<priority value="DEBUG" />
</category>

parce que la classe que je développe c est un "orchestrator" c est un
manager qui manage des manager cad qui n a pas de Dao et du coup j ai
que la possibilité de visualiser les transaction que sur la console
pour le moment

précisément j utilise un patern pour les methode de dump()
On 21 sep, 12:50, bacem riahi <bacem.ri...@gmail.com> wrote:
> Salem,
> à la limite si tu n'as pas specifié la façon de rollbacker dans ta conf tu
> pourras ajouter cette ligne au catch de ton exception (1ere transaction):
>
> *TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();*
>
> Le 21 septembre 2011 12:38, bacem riahi <bacem.ri...@gmail.com> a écrit :
>
> > tu fais comment pour gérer ouvrir tes transactions ? c'est avec
> > l'annotation @Transactional ?
> > si oui quels attributs tu pércises ? (à part la propagation bien)
>
> > Le 21 septembre 2011 11:40, yosri naghmouchi <nyosri.a...@gmail.com> a

yosri naghmouchi

unread,
Sep 21, 2011, 10:14:48 AM9/21/11
to TeeJUG
Salem,
Merci infiniment Bacem ça marche nickel je viens de le tester il
rollback la T1 et commit la T2 et pas la peine de thrower la
RuntimeException

bacem riahi

unread,
Sep 21, 2011, 10:21:22 AM9/21/11
to tee...@googlegroups.com
ok merci

bacem riahi

unread,
Sep 21, 2011, 9:59:29 AM9/21/11
to tee...@googlegroups.com
en fait ce que je comprend c'est comment un RuntimeException peut rollbacker une transaction, normalement c'est juste les Exception autre que Runtime qui peuvent rollbacker une exception, sauf que tu précises l'attribut rollback-for.
et ta transaction T2 elle ne produit pas d'erreur ?

yosri naghmouchi

unread,
Sep 21, 2011, 10:43:11 AM9/21/11
to tee...@googlegroups.com
enfaite j'ai pas le choix je dois remonter une exception coté service pour forcer le rollback et puisque onMessage() que je overide de l'interface MessageListener qui se trouve dans la couche sup de mon module je peux pas thrower des exception .
par-contre il y a pas une autre méthode pour le faire  c.a.d des modifs sur l Aop  coté TxManager  ??

<-  Best regards ->
       -=NY=-
Reply all
Reply to author
Forward
0 new messages