Dans JMS message asynchrone manipulation dès que onMessage() est appelé, message supprimé de la file d'attente
Exigence: je veux des messages persistent dans la file d'attente jusqu'à onMessage()
exécutée avec succès. Si une exception se produire lors de l'exécution de onMessage()
et si elle n'est pas gérer le message doit être livré de nouveau à l'auditeur.
Je vais avoir Glassfish v2 comme un serveur d'application. Je suis à l'aide de OpenMQConnectionFactory et JmsTemplate pour envoyer un message sur la file d'attente.
Veuillez noter que je ne suis pas à l'aide de MDB.
<bean id="openMQConnectionFactory"
class="com.is.br.util.OpenMqConnectionFactoryBean">
<property name="imqAddressList" value="mq://localhost:7676" />
<property name="imqDefaultUsername" value="admin" />
<property name="imqDefaultPassword" value="admin" />
</bean>
J'ai essayé AUTO_ACKNOWLEDGE comme reconnaissez mode, mais dans l'écouteur lorsque exception levée message n'est pas en rupture de stock.
MessageProducer.java
public void sendMessage(final String responseStream) {
System.out.println("Enter into IsJmsProducer.sendMessage method");
try {
MessageCreator creator = new MessageCreator() {
public Message createMessage(Session session) {
ObjectMessage message = null;
try {
message = session.createObjectMessage(responseStream);
} catch (Exception e) {
System.out.println("Unable create a JMSMessage");
}
return message;
}
};
System.out.println("Sending message to destination: " + this.destination.toString());
this.jmsTemplate.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
this.jmsTemplate.send(this.destination, creator);
System.out.println("SendMessage to queue successfully.");
} catch (Exception ex) {
System.out.println("SendMessage to queue Fail." + ex);
}
System.out.println("Exit from IsJmsProducer.sendMessage method");
}
SampleJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
throw new RuntimeException();
}
}
Puis j'ai essayé avec this.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
et dans le port d'écoute, j'ai appelé message.acknowledge();
et dans catch
bloc, j'ai appelé session.recover()
encore de message n'est pas une nouvelle livraison.
SampleJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
@Override
public void onMessage(Message message) {
ObjectMessage objectMessage = (ObjectMessage) message;
Object object;
try {
object = objectMessage.getObject();
if (object instanceof String) {
System.out.println("Message received - " + object.toString());
throw new JMSException("JMS exception");
}
message.acknowledge();
} catch (JMSException e) {
session.recover();
}
}
}
Quand je lance le programme en mode debug et j'ai envoyer un message sur la file d'attente dans courtier console d'admin, je suis capable de voir le nombre de messages, mais dès que onMessage() appelé nombre de messages se réduire par un. Que signifie le message est consommé et supprimé de la file d'attente. Ce message est-il considérer comme "livré"?
S'il vous plaît aidez-moi à comprendre pourquoi le message n'est pas restituer lorsque l'exception se produire?
Merci à l'avance.
OriginalL'auteur Ashwini | 2012-07-16
Vous devez vous connecter pour publier un commentaire.
Je pense que c'est voulu par la conception, remis lors de la onmessage est appelée. Si vous voulez faire quelque chose au sujet de l'exception que vous pouvez les gérer à l'aide de try catch.
Assumer le message a été mis sur la file d'attente une fois de plus, vous serait probablement frappé de la même exception, lorsqu'il est consommé de toute façon.
L'accusé de réception des mécanismes de l'omi devrait être un gage de livraison erronée. Peut-être ce que vous êtes après est un mécanisme de rejet où vous demandez la prpoducerside envoyer un nouveau message?
OriginalL'auteur Aksel Willgert
Client reconnaît est adapté pour vous. Dans votre onMessage() la méthode, une fois que le traitement est terminé, vous devez appeler Reconnaître sinon, si il n'y a aucune exception, alors vous n'appelez pas Reconnaître().
Session.De récupération() s'arrête et redémarre à la livraison du message. La livraison du message à partir de la dernière sans accusé de réception du message.
Non, le message ne sera pas supprimé jusqu'à ce que vous appelez le Reconnaître() dans votre méthode onMessage lors de l'utilisation de CLIENT_ACKNOWLEDGE session. Je vous suggère de vérifier de nouveau le test.
OriginalL'auteur Shashi
Je suggère de vérifier quel est le défaut le mode de session pour OpenMQ. Il peut arriver que, une fois que vous avez établi une connexion, vous ne pouvez pas le modifier, de sorte que doit être spécifiée au moment de la connexion openin.
OriginalL'auteur Edmondo1984
session créée en consommateur doit définir le mode de session à AUTO_ACK /DUPS_OK_ACK. Vous n'avez pas votre code pour partir à la consommation. Vous êtes à la session de réglage de mode de Producteur, mais pas à la Consommation.
OriginalL'auteur Amrish Pandey