javax.jms.MessageConsumer se bloque à recevoir lors de la consommation fermé
Selon la javadoc, si je l'appelle à recevoir() sur un javax.jms.MessageConsumer il permet de bloquer indéfiniment jusqu'à ce qu'un message est produit ou jusqu'à ce que le message de consommation est fermé.
J'ai un thread dans lequel un receive() est appelée. Dans le cadre de l'arrêt thread, je fais appel à close(), mais le consommateur, bloque en recevoir() et de sorte que le fil ne sera pas de l'arrêt. L'essentiel de mon code est:
public String receiveMessage() {
...
...
System.out.println("About to receive")
TextMessage message = (TextMessage) consumer.receive();
System.out.println("No longer receiving")
...
...
}
public void stop() {
try {
if (consumer != null) {
consumer.close();
}
} catch (JMSException ex) {
throw new IllegalStateException(ex);
}
}
Dans le débogueur je peux les voir de plus près() est appelée, mais les recevoir encore des blocs. Si j'utilise la méthode receive() avec un délai d'attente seront bloquées jusqu'à l'expiration de ce délai.
Tout semble bonne pour moi, j'espère que quelqu'un peut me dire ce que je fais de mal.
Merci pour votre réponse. C'est IBM MQ 7.0.0.2
receiveNoWait
OriginalL'auteur DaveRlz | 2011-11-04
Vous devez vous connecter pour publier un commentaire.
J'ai trié le problème, je ne faisais pas une connexion.start() n'importe où. Une fois j'ai mis cela dans le MessageConsumer.recevoir() arrêté de blocage lorsque j'ai fermé et tout a fonctionné comme je l'avais prévu.
Merci pour vos suggestions.
OriginalL'auteur DaveRlz
Une autre pensée.
Dans JMS, Connexion multi-thread. Session et ci-dessous (Consommateur, Producteur, Message, etc) ne sont pas thread-safe. Si vous êtes accéder à tous que non thread-safe choses à partir de plusieurs threads, vous êtes responsable pour éviter le multi-thread accès.
Le code que vous montrons ci-dessous dirait que vous êtes des appels de méthodes sur la Consommation à partir d'un couple de threads. Une violation de cette règle.
Il pourrait être plus sûr de fermer la Connexion de l'objet. Pas de filetage conflits et raisonnable de mise en œuvre permettrait de faire la bonne chose pour nettoyer les ressources associées w/la Connexion.
OriginalL'auteur John M
Mais encore, appelant à la consommation.close() sur un autre thread n'est pas la bonne chose à faire. Vous aurez besoin de faire une connexion.À proximité, qui prendra soin de fermer toutes les sessions, les consommateurs, les producteurs, etc en vertu de cette connexion.
OriginalL'auteur Shashi
receive(long timeout)
, et n'oubliez pas de vérifier que retourné mesage n'est pasnull
.consumer.close()
vous pouvez également interrompre le scrutin thread - siclose()
est mal mise en place et de ne pas notifier bloqué le récepteur, ce sera à son réveil.Oui, une autre chose - si c'est une partie de la fermeture de l'ensemble de l'application, fermer l'ensemble des objets (
MessageConsumer
,Session
,Connection
).OriginalL'auteur Andrey Nudko