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

时间:2010-04-07 15:14:13

标签: spring exception jms

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

在调用onMessage时,队列是否认为消息是“传递”的?或者JmsException是否触发某种回滚并且消息在队列中重新输入?

提前致谢!

1 个答案:

答案 0 :(得分:15)

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

4.5.2异步交付

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

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

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

  • AUTO_ACKNOWLEDGE或 DUPS_OK_ACKNOWLEDGE - 消息 将立即重新传递。该 JMS提供程序的次数 之前重新传递相同的信息 放弃是依赖提供者的。该 JMSRedelivered消息头字段 将被设置为重新传递的消息 在这种情况下。
  • CLIENT_ACKNOWLEDGE - 下一条消息 为听众交付。如果一个 客户希望拥有前一个 未确认的消息重新传递, 它必须手动恢复会话。
  • 交易会话 - 下一条消息 为听众交付。该 客户端可以提交或回滚 会议(换句话说,a RuntimeException没有 自动回滚会话。)。

JMS提供程序应该标记客户端正在抛出的消息侦听器 RuntimeExceptions可能出现故障。