2009-02-05 5 views
7

J'ai un processus qui implique l'envoi d'un message JMS. Le processus fait partie d'une transaction. Si une partie ultérieure de la transaction échoue, une partie qui est après une partie précédente qui a envoyé le message, j'ai besoin d'annuler le message. Une pensée que j'ai eu était de quelque part mis sur le message qu'il ne doit pas être ramassé pendant un certain laps de temps, et si j'ai besoin de revenir en arrière, alors je pourrais aller annuler le message. Ne sachant pas de messagerie, je ne sais pas si l'idée est possible. Ou, y a-t-il une meilleure idée? MerciJMS rollback

Répondre

7

Vous pouvez utiliser JMS et JTA (Java Transaction API) ensemble - see here. Dans ce cas, l'envoi d'un message JMS ou la consommation d'un message reçu se produit réellement de manière atomique dans le cadre de la validation de la transaction.

Qu'est-ce que cela signifie? Si la transaction échoue ou est annulée, le message "envoyé" ne disparaît pas et les messages "reçus" ne sont pas réellement consommés. Tout est géré pour vous par votre fournisseur JMS et JTA.

Vous devez utiliser une implémentation JMS prenant en charge JTA. On dirait que vous utilisez déjà des transactions, il pourrait donc être question de faire une configuration pour y arriver (en agitant la main vigoureusement ...).

J'ai déjà eu l'occasion d'utiliser ceci (BEA WebLogic 7 avec BEA WebLogic Integration). Travaillé comme annoncé - "le monde extérieur" n'a vu aucun impact des choses de JMS que j'ai essayées à moins que la transaction s'est engagée avec succès.

8

Ce que vous avez décrit est une transaction XA. Cela permet à une transaction de s'étendre sur plusieurs couches, à savoir le fournisseur JMS, la base de données ou tout autre EIS. La plupart des conteneurs peuvent être configurés pour utiliser à la fois des transactions non XA et aucune transaction XA, vérifiez donc les paramètres de votre conteneur!

Par exemple, si vous utilisez JMS avec des transactions XA, les opérations suivantes sont possibles.

Start Transaction 
     | 
    DB Insert 
     | 
    Send JMS Msg 
     | 
    More DB Inserts 
     | 
    Commit Transaction <- Only at this point will the database records be inserted and the JMS message sent. 

XA tranactions ne sont disponibles que dans des conteneurs pleins Java EE donc les transactions XA ne sont pas disponibles dans Tomcat.

Bonne chance!

Karl

+0

Veuillez également prendre en compte la performance des frais généraux: http://stackoverflow.com/questions/12305900/performance-overhead-of-xa-data-sources-best-practices – Vadzim