使用JMS时处理JMSExceptions,特别是ActiveMQ?

时间:2014-01-06 16:58:16

标签: java jms activemq mom

在以下代码段中:

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只是一个规范。)

1 个答案:

答案 0 :(得分:1)

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

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