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.

Salut Ashwini. Je suis en train de faire quelque chose de similaire. Je suis à l'aide de JMSTemplate envoyer le message et le listners sont démarrés par DefaultMessageListenerContainer. Mon Problème est que je n'ai aucun objet de session dans onMessage méthode pour récupérer. Comment avez-vous passer votre objet de session à votre Listner dans le code ci-dessus?

OriginalL'auteur Ashwini | 2012-07-16