1

在以下代码段中:

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,所以拆掉并重新开始是正确的consumer事情session?或者这是否意味着connection已经变坏了,所以我应该拆除并重建应用程序中基于该连接的所有内容?或者呼叫能否以createConsumer()暂时的方式失败,并且使用同一会话重试呼叫可能会成功?

类似地,这些行什么时候会抛出一个JMSException,忽略类似于封闭的SessionConnection

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

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

4

1 回答 1

2

可以出于多种原因引发异常。最常见的是由于网络或代理故障而导致连接丢失。其他原因可能是代理资源耗尽、安全违规等。

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

于 2014-01-06T17:26:40.393 回答