我正在开发一个 JMS 客户端,它使用QueueReceiver
, 并且特别是receiveNoWait
方法同步地使用队列消息。两者receive
和receiveNoWait
都指定为抛出一个JMSException
,这意味着这是检测 JMS 故障的可靠方法:
try {
Message message = queueReceiver.receiveNoWait();
// handle message
} catch (JMSException e) {
// handle failure
}
但是,JMS sepcification (1.1) 和在线文档有这样的说法关于注册ExceptionListener
:
有些连接只消耗消息,所以他们没有其他方法可以知道他们的连接失败了。
我知道这对于使用消息侦听器的异步消费来说是必然的,但上面的陈述似乎并没有区分同步消费和异步消费。我是否应该认为我的程序“没有其他方法”——除了注册一个异常监听器——来了解连接失败,因此上面的代码不会,或者不能保证被 JMS 规范检测到连接失败?我真的需要为此注册一个异常侦听器吗?
如果这不是由标准决定的,那么 JMS 提供者通常如何处理这个问题 - 如果没有设置 ExceptionListener,他们会抛出接收/接收无等待吗?我对 JBoss、Websphere Application Servers Service Itegration Bus、Websphere MQ 和 Weblogic JMS 特别感兴趣。