2009-11-03 16 views
0

Comment puis-je reconnais un message lorsque j'utilise un écouteur de message?JMS Reconnaissez Asynchronous message

Je reçois l'erreur suivante lorsque j'essaie de faire un accusé de réception dans mon écouteur de message.

Répondre

-1

Un message asynchrone, par définition, ne devrait pas être accusé de réception au niveau du protocole. Si vous voulez un accusé de réception, vous devez le construire dans votre application, à quel point les questions sont pourquoi n'utilisez-vous pas un schéma synchrone.

1

Vous parlez de l'accusé de réception des messages JMS comme dans Message.acknowledge()?

Cette erreur semble un peu étrange. Si vous n'utilisez pas de transactions ou de confirmation automatique, je pense que vous devez appeler cette méthode. Et si vous faites une écoute asynchrone, où faites-vous pour le faire en dehors de la méthode onMessage()?

Cet appel est-il effectué dans le même thread que celui qui a reçu l'appel onMessage()? En d'autres termes, dans onMessage() ou dans une méthode appelée depuis onMessage()? Sinon, vous enfreignez les règles de thread de JMS. Les sessions et les producteurs/consommateurs et tout ce qui va plus loin (comme les messages) ne sont pas sécurisés. Vous devez vous assurer que vous ne les touchez pas à partir de plusieurs threads. Si vous êtes au milieu d'un appel onMessage() et que vous organisez un autre thread pour faire cet appel à Message.acknowledge(), vous méritez d'échouer à cause du problème de thread. Si oui, déplacez cet appel de retour sur le même fil que onMessage() est en cours d'exécution dans.

1

Voici un exemple pour la file d'attente Session

session = connection.createQueueSession(false, Session.CLIENT_ACKNOWLEDGE); 

Seulement si

if (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE) // 

Alors pouvons-nous avoir

message.acknowledge(); 

Vérifiez la classe de message ici (http://java.sun.com/j2ee/1.4/docs/api/javax/jms/Message.html)

0

Vérifiez si votre session exige la reconnaissance en utilisant la méthode de la session, si elle ne puis juste appeler la méthode acknowledge() getAcknowledgeMode() sur le message lui-même

0

Pour amplifier la première réponse un peu pour la postérité: l'OP probablement créé sa session en mode d'acquittement mis à Session.AUTO_ACKNOWLEDGE, ce qui signifie que le fournisseur reconnaît automatiquement les messages qu'ils sont livrés à la connexion (pour la livraison synchrone) ou après votre MessageListener # onMessage() est appelé (pour la livraison asynchrone) .

Il a obtenu l'exception car son appel explicite au message # acquittement() n'est pas valide dans ce mode. Comme le fait remarquer Buhake Sindi, si vous souhaitez confirmer manuellement les messages, vous devez choisir Session.CLIENT_ACKNOWLEDGE lorsque vous configurez la session à partir de laquelle le MessageConsumer sera créé. Ensuite, chaque fois que vous appelez le message # acquittement(), le message en cours, ainsi que tous les autres messages livrés mais non acquittés remis à cette session/consommateur, seront renvoyés au courtier.