【发布时间】:2011-02-05 07:45:11
【问题描述】:
我将 Spring 2.5 与实现 MessageListener 的自定义类一起使用。如果在我的 onMessage() 方法中抛出 JmsException,队列的状态会发生什么变化?
在调用 onMessage 的那一刻,消息是否被队列视为“已传递”?或者 JmsException 是否触发某种回滚并且消息重新进入队列?
提前致谢!
【问题讨论】:
我将 Spring 2.5 与实现 MessageListener 的自定义类一起使用。如果在我的 onMessage() 方法中抛出 JmsException,队列的状态会发生什么变化?
在调用 onMessage 的那一刻,消息是否被队列视为“已传递”?或者 JmsException 是否触发某种回滚并且消息重新进入队列?
提前致谢!
【问题讨论】:
来自 JMS 1.1 规范...
4.5.2 异步传递
客户端可以使用 MessageConsumer 注册实现 JMS MessageListener 接口的对象。当消息到达消费者时,提供者通过调用侦听器的 onMessage 方法来传递它们。
监听器有可能抛出 RuntimeException;但是,这被认为是客户端编程错误。表现良好的侦听器应捕获此类异常并尝试将导致它们的消息转移到某种形式的特定于应用程序的“无法处理的消息”目的地。
监听器抛出 RuntimeException 的结果取决于会话的确认模式。
JMS 提供者应该使用正在抛出的消息侦听器来标记客户端 RuntimeExceptions 可能出现故障。
【讨论】: