当onMessage()抛出JMSException时,JMS队列会发生什么?

use*_*121 15 spring jms exception

我正在使用Spring 2.5和我实现MessageListener的自定义类.如果在我的onMessage()方法中抛出JmsException,那么队列的状态会发生什么?

在onMessage被调用的那一刻,消息是否被队列视为"传递"?或者JmsException是否触发某种回滚并且消息在队列中重新输入?

提前致谢!

Joh*_*n M 16

来自JMS 1.1规范......

4.5.2异步传递

客户端可以使用MessageConsumer注册实现JMS MessageListener接口的对象.当消息到达消费者时,提供者通过调用监听器的onMessage方法来传递消息.

侦听器可能会抛出RuntimeException; 但是,这被认为是客户端编程错误.表现良好的侦听器应该捕获此类异常,并尝试将消息转移到某种形式的特定于应用程序的"不可处理消息"目标.

抛出RuntimeException的侦听器的结果取决于会话的确认模式.

  • AUTO_ACKNOWLEDGE或DUPS_OK_ACKNOWLEDGE - 将立即重新传递该消息.JMS提供程序在放弃之前重新发送相同消息的次数取决于提供程序.将为在这些情况下重新传递的消息设置JMSRedelivered消息头字段.
  • CLIENT_ACKNOWLEDGE - 传递侦听器的下一条消息.如果客户希望重新传送先前未确认的消息,则必须手动恢复会话.
  • 事务会话 - 传递侦听器的下一条消息.客户端可以提交或回滚会话(换句话说,RuntimeException不会自动回滚会话).

JMS提供程序应该将客户端标记为可能导致RuntimeExceptions失效的消息侦听器.