要件:onMessage()正常に実行されるまでメッセージをキューに保持したい。の実行中に何らかの例外が発生しonMessage()、それがハンドルされていない場合、メッセージはリスナーに再配信される必要があります。
アプリケーション サーバーとして Glassfish v2 を使用しています。OpenMQConnectionFactory と JmsTemplate を使用してメッセージをキューに送信しています。 私は 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>
応答モードとして AUTO_ACKNOWLEDGE を試しましたが、例外がスローされたメッセージが再配信されないときにリスナーで試しました。
MessageProducer.java
public void sendMessage(最終文字列 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");
}
サンプルJMSConsumer.java
public class SampleJMSConsumer implements MessageListener {
    @Override
    public void onMessage(Message message) {
        throw new RuntimeException();
   }
}
次にthis.jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);、私が呼び出したリスナーで  試してみましたが、まだメッセージを呼び出しmessage.acknowledge();たcatchブロックで再配信されません。session.recover()
サンプルJMSConsumer.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();
        }
    }
}
プログラムをデバッグ モードで実行し、ブローカ管理コンソールのキューでメッセージを送信すると、メッセージの数を確認できますが、onMessage() が呼び出されるとすぐに、メッセージの数が 1 つ減ります。つまり、メッセージが消費され、キューから削除されます。そのメッセージは「配信済み」と見なされますか? 例外が発生したときにメッセージが再配信されない理由を理解してください。
前もって感謝します。