In asynchronen JMS-message-handling, sobald onMessage() aufgerufen wird, wird die Nachricht aus der Warteschlange gelöscht

Voraussetzung: ich möchte die Nachrichten bleiben in der Warteschlange bis onMessage() erfolgreich ausgeführt. Wenn jede exception, die auftreten, während der Ausführung von onMessage() und wenn es nicht behandeln, dann die Nachricht übermittelt, um Zuhörer.

Ich bin mit Glassfish v2 als application server. Ich bin mit OpenMQConnectionFactory und JmsTemplate zu senden-Nachricht in der Warteschlange.
Bitte beachten Sie, dass ich bin nicht mit 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>

Versuchte ich AUTO_ACKNOWLEDGE als acknowledge-Modus, aber im Hörer als Ausnahme-Nachricht wird nicht übermittelt.

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();
   }
}

Dann habe ich versucht mit this.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); und in den Hörer rief ich message.acknowledge(); und in catch block rief ich session.recover() noch Nachricht nicht wieder.

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();
        }
    }

}

Wenn ich das Programm im debug-Modus und ich Nachricht in der Warteschlange im broker-admin-Konsole, ich bin in der Lage, um zu sehen, die Anzahl der Nachrichten, aber sobald onMessage() aufgerufen, die Anzahl der Nachrichten zu reduzieren. Das bedeutet, dass die Nachricht konsumiert wird und aus der Warteschlange gelöscht. Ist, die Nachricht zu betrachten, da "ausgeliefert"?
Bitte helfen Sie mir zu verstehen, warum die Nachricht nicht wieder als Ausnahme auftreten?

Vielen Dank im Voraus.

Hi, Ashwini. Ich bin versucht, etwas ähnliches zu tun. Ich bin mit JMSTemplate um eine Nachricht zu senden und listners gestartet werden DefaultMessageListenerContainer. Mein Problem ist, ich habe keine session-Objekt in der onMessage-Methode zu erholen. Wie übergeben Sie Ihre session-Objekt zu Ihrem Listner im obigen code?

InformationsquelleAutor Ashwini | 2012-07-16

Schreibe einen Kommentar