Synchronisation des transactions de printemps de JDBC et JMS
J'ai un printemps application web s'exécutant sur jboss qui est actuellement configuré pour utiliser le HibernateTransactionManager pour les transactions db et la JmsTransactionManager de jms. Pour jms nous utilisons Chameau et ActiveMQ, notre base de données DB2. Au sein d'une transaction j'ai besoin d'écrire un certain nombre d'enregistrements de la base de données et envoyer des deux asynchrone des messages jms. Le jms messages sont des notifications d'événements et je veux seulement à être envoyé si la base de données de validation de transaction.
Je suis prêt à accepter le risque de la communication avec le courtier en défaut après le jdbc, la transaction a déjà commis (et donc pas les messages envoyés mais db engagé), donc je ne pense pas que j'ai besoin d'un bon XA.
Je crois que ce dont j'ai besoin est "mieux", la gestion des transactions à l'aide de printemps de l'opération de synchronisation.
Le ressort de la documentation de tri des indications à l'effet que le printemps sera de synchroniser les deux opérations et à engager les jms transaction qu'après l'jdbc transaction a été commise, mais je ne pense pas que c'est très clair. Le printemps de la documentation ici http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html#tx-resource-synchronization n'a pas été assez en détail sur la façon dont il fonctionne.
J'ai trouvé un couple de d'autres sources qui disent que le printemps va faire ce que je veux, y compris certains javadoc ci-dessous, et j'ai écrit quelques tests d'intégration que de leur montrer.
http://static.springsource.org/spring/docs/3.0.x/api/org/springframework/jms/support/JmsAccessor.html#setSessionTransacted%28boolean%29 La javadoc sur setSessionTransacted ici ressemble exactement à ce que je veux.
De ce que j'ai vu je pense que la création du Chameau JmsConfiguration traitées avec la valeur true, comme cela est suffisant:
<bean id="jmsConfig" class="org.apache.camel.component.jms.JmsConfiguration">
<property name="connectionFactory" ref="pooledConnectionFactory"/>
<property name="transacted" value="true"/>
<property name="concurrentConsumers" value="10"/>
</bean>
Cependant j'ai besoin de convaincre quelqu'un que je travail avec un peu sceptique et pense que mon test d'intégration ne fonctionne qu'en raison d'un mal documentées d'effets secondaires plutôt qu'un intentionnelle printemps fonctionnalité.
Donc ma question est, ai-je raison que le printemps peut être invoqué pour synchroniser les opérations et toujours s'engager jms transaction après l'jdbc transaction ou n'est-ce pas quelque chose que je devrais compter sur, et pourriez-vous m'indiquer à toute la documentation officielle qui dit clairement? Et je suppose que, en général, est-ce une bonne approche pour prendre ou devons-nous la gestion de ces opérations d'une manière différente?
source d'informationauteur laurie
Vous devez vous connecter pour publier un commentaire.
Cet article, pourrait être d'aider Les transactions distribuées au Printemps, avec et sans XA. Je ne pense pas qu'il couvre votre cas précisément, de l'envoi de message + mise à jour de la base de données.
Officiel du Printemps de Démarrage référentiel contient JTA exemples qui combinent JMS avec JDBC basé sur AtomikosBitronix ou Serveur Java EE JBoss WildFly.
En outre, j'ai également créé quelques exemples qui sont situé dans mon dépôt Github. Il contient aussi des non-Printemps de Démarrage (pure) exemple.
Si vous utilisez les transactions Locales
Et le cas d'utilisation est de sauvegarder la base de données et l'envoyer ensuite à jms
Il pourrait y avoir trois cas :
Maintenant, vous ne voulez pas l'utiliser XA, de sorte que les solutions pourraient être
1)Vérifiez Si le message.getJmsRedelivered() {...}
Si non , traiter
Si sa rupture de stock , vérifiez si vous avez traité déjà
Vérifier si les données sont dans la base de données basée sur les détails dans le message
Noter que re-livraisons sont rares donc , cette vérification est également rare et il n'y a pas de frais généraux
2)Si votre méthode est la quantité , alors vous n'avez pas besoin de cette case
Et concernant XA , XA garantit que le message est délivré qu'une seule fois
Et la synchronisation de la transaction à travers de multiples ressources
Mais avec XA , vous avez les frais généraux
Donc, si vous pouvez gérer sans XA , il est préférable