在以下代码段中:

Connection connection=getConnection();
try {
    Session session=connection.createSession();
    try {
        Queue queue=session.createQueue("foobar");
        MessageConsumer consumer=null;
        try {
            consumer = session.createConsumer(queue);
        }
        catch(JMSException e) {
            // Under what circumstances does this happen?
        }
        try {
            // ...
        }
        finally {
            if(consumer != null) consumer.close();
        }
    }
    finally {
        session.close();
    }
}
finally {
    connection.close();
}


在什么情况下被捕获的JMSException被抛出?发生这种情况时,处理JMSException的正确方法是什么?我已经阅读了JMS和ActiveMQ文档的相关内容,在这一点上似乎没有提供任何指导(显然,除了使用try / catch以外。)还请原谅人为的代码示例!

例如,如果JMSException在某种程度上“变坏”了,是否会发生session,因此拆解consumersession并重新开始是正确的事情吗?还是说connection变坏了,所以我应该拆除并重建基于该连接的应用程序中的所有内容?还是对createConsumer()的调用会暂时失败,并且可以在同一会话中重试该调用?

类似地,这些行何时会抛出JMSException,而忽略诸如封闭的SessionConnection之类的东西:

Message message=consumer.receive();
producer.send(message);


我想了解一般在JMS中应如何处理JMSException,但是特定于ActiveMQ的答案也很好。 (实际上,由于JMS只是一个规范,因此任何答案都可能必须特定于特定的实现。)

最佳答案

引发异常有多种原因。最常见的是由于网络或代理中断而导致连接丢失。其他原因可能是代理上的资源耗尽,违反安全性等。

为了避免由网络连接问题引起的异常,您可以使用ActiveMQ的故障转移传输来让客户端进行自动重新连接。 JMS中有许多异常类型,因此您可以测试给定的错误,例如检查是否由于安全异常而导致使用者创建者或生产者发送失败。如果您不知道实际原因,那么最常见的事情就是拆除并重建连接资源。这就是使用故障转移更好的原因,因为通过让客户端处理检测并响应此问题,您可以避免很多工作。

09-26 17:30