2012-04-10 6 views
2

J'envoie des requêtes JMS à un serveur Weblogic 10.3 via une file d'attente JMS nommée et je reçois une réponse dans une file d'attente temporaire.La file d'attente temporaire JMS supprime le premier message

client (barebone):

(bean géré par message)
//init 
Destination replyQueue = session.createTemporaryQueue(); 
replyConsumer = session.createConsumer(replyQueue); 
... 
//loop 
TextMessage requestMessage = session.createTextMessage(); 
requestMessage.setText("Some request") 
requestMessage.setJMSReplyTo(replyQueue); 
requestProducer.send(requestMessage); 
Message msg = replyConsumer.receive(5000); 
if (msg instanceof TextMessage) { 
    ... 
} else { ... } 
//loop end 

MDB serveur:

public void onMessage(Message msg) { 
    if (msg instanceof TextMessage) { 
     ... 
     TextMessage replyMessage = jmsSession.createTextMessage(); 
     replyMessage.setText("Some response"); 
     replyMessage.setJMSCorrelationID(msg.getJMSCorrelationID()); 
     replyProducer.send(replyMessage); 
    } 
} 

Le problème est que la première réponse du serveur est souvent perdu! En d'autres termes, le replyConsumer.receive(5000) se termine avec un délai d'attente pour chaque 4e et 5e réponsesConsommateur. Lorsque le consommateur reçoit la première réponse, il continue à recevoir tout le reste, donc le problème est uniquement avec le premier message envoyé à travers la file d'attente temporaire après que la file d'attente temporaire a été créée.

Ma question: Dois-je définir quelque chose de spécial pour la file d'attente temporaire afin qu'elle fonctionne dès le départ après sa création? Ou tout autre indice?

Plus d'info:

  • Lors du test contre ma machine de développement local, les files d'attente temporaires fonctionnent sans problème. Les messages ne sont perdus que lors des tests sur notre serveur Weblogic en cluster. Cependant, j'ai désactivé tous les membres du cluster, sauf un.
  • J'ai vérifié que le serveur répond avec succès toutes les demandes que le client envoie (en comptant les demandes envoyées et les réponses envoyées). Le serveur répond dans l'ordre de millisecondes, même pour les réponses perdues.
  • Lorsque je remplace la file d'attente temporaire par une file d'attente régulière, le problème disparaît! Donc le problème ne me semble pas être dans mon code.
  • J'ai également essayé de modifier l'expiration, la persistance, le délai etc. du message de réponse, mais sans succès. De cette façon, j'ai exclu le scénario que la réponse arrive plus tôt que le client commence à lire la file d'attente, puis le message expire immédiatement ne donnant pas au client une chance de le traiter.
  • Modifier: Au lieu du replyConsumer.receive(5000) synchrone, j'ai également essayé d'utiliser le replyConsumer.setMessageListener(this) asynchrone. Le comportement n'a pas changé, les premiers messages sont toujours perdus pour les files d'attente temporaires.

Edit: Il semble qu'il y ait quelque chose de mal avec le serveur Weblogic (ou cluster) J'utilise. Parce que lorsque j'ai déployé l'application serveur sur un autre cluster Weblogic, tout a commencé à fonctionner correctement! Les deux clusters doivent être configurés de manière identique - alors, où est la différence? Cela me fait peur que le Weblogic ne signale aucune erreur.

+0

Nous n'avons pas trouvé la raison de ce mauvais comportement. Cependant, la re-création du domaine a aidé - le nouveau domaine fonctionne sans problèmes. – xarx

Répondre

1

Votre problème semble être que parfois le serveur reçoit le publier et le rejeter avant que votre client a commencé à recevoir. La solution consiste à utiliser les appels reçus asynchrones (replyConsumer.setMessageListener) au lieu de l'appel de blocage que vous avez actuellement (replyConsumer.receive (5000)) et à ajouter l'appel au code avec le reste de votre client code.

De cette façon, vous écoutez déjà les réponses avant d'envoyer la demande.

Espérons que cela aide.Edit: Lisez simplement que vous utilisez une file d'attente temporaire, donc ma première phrase n'est pas correcte. Cependant, en tant qu'expérience, essayez le reste de ma réponse pour voir si cela change le comportement que vous voyez

+0

J'ai essayé ce que vous avez suggéré, mais sans succès. J'ai modifié mon message et ajouté d'autres informations. – xarx

Questions connexes