2009-06-22 8 views
2

En fait, JBoss envoie le message, mais seulement lorsque la transaction en cours démarrée par l'EJB est terminée.JBoss n'envoie pas de message JmsTemplate (Spring)

Nous avons ce problème avec JBoss 4.0.3 et JmsTemplate de Spring. Un EJB envoie un message à une file d'attente avec une file d'attente temporaire en tant que champ reply_to. Ensuite, à l'intérieur de la même transaction, nous écoutons la réponse donnée par le premier MDB. Le problème est que la méthode "send" de JmsTemplate n'est pas exécutée une fois la transaction terminée. Ainsi, au moment où le message est envoyé à la file d'attente et traité par la MDB, l'écouteur de la file d'attente temporaire est parti.

Ceci est appelé "Réception synchrone"

Deux choses changent ce comportement, mais soulève certaines préoccupations:

  1. Changer le type de transaction de l'EJB à BMT. (Préoccupation: BMT suce)

  2. Créez un thread tout ce qu'il fait est d'appeler la méthode JmsTemplate.send().

Comme une note de côté, c'est un EJB qui fonctionne correctement sur un environnement weblogic, et le message ne sont envoyés quand il se doit, au milieu de la transaction pas quand il est fini.

Merci pour toute aide.

+0

Ce comportement est le même sur toutes les versions JBoss que j'ai testées: 4.2, 5.0 et 5.1 – Eldelshell

Répondre

1

Le comportement de JBoss est correct. JMS est une API transactionnelle, et envoie ne doit être exécuté que lorsque le tx est validé.

Il peut être possible de convaincre JmsTemplate de ne pas utiliser le contexte transactionnel actuel, bien qu'il s'efforce de cacher le désagrément de l'API JMS.

+0

"et les envois ne doivent être exécutés que lorsque le tx valide" Mais cela interdit toute utilisation possible des réceptions synchrones. – Eldelshell

+0

Dans le cadre d'une transaction, oui. Mais si vous pouvez persuader JmsTemplate de s'exécuter en dehors de ce contexte, alors vous devriez être OK. Sinon, n'utilisez pas JMSTemplate - c'est juste un wrapper autour de l'API JMS. – skaffman

+0

Je marque votre réponse en tant que _the_ un depuis qu'il m'a eu dans la bonne direction. Pour ne pas utiliser le contexte de transaction actuel, j'ai utilisé ma deuxième option décrite dans la question. – Eldelshell

0

Vous pouvez encapsuler le modèle JMS dans du code, soit un bean de session sans état, soit une méthode de service utilisant la gestion des transactions de Spring, qui utilise une propagation de transaction de REQUIRES_NEW. De cette façon l'envoi du message est dans sa propre transaction qui va commettre l'envoi du message en dehors de la portée de la transaction d'emballage.

Je ne sais pas pourquoi cela fonctionnerait sur Weblogic cependant. Je suppose que sur Weblogic, il ne reconnaît pas la file d'attente comme une file d'attente XA.

+0

Merci Jason, je vais jeter un oeil à cette solution et voir si les choses fonctionnent comme prévu. – Eldelshell

Questions connexes