java - 使用 JMS(特别是 ActiveMQ)时处理 JMSException?

标签 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 )。还请原谅做作的代码示例!

例如,如果session以某种方式“变坏”,是否会发生JMSException,因此拆除consumer是正确的事情> 和 session 并重新开始?或者这是否意味着连接已经坏了,所以我应该拆除并重建应用程序中基于该连接的所有内容?或者,对 createConsumer() 的调用是否会暂时失败,而使用同一 session 重试该调用可能会成功?

类似地,这些行何时会抛出 JMSException,忽略诸如关闭的 SessionConnection 之类的内容:

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

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

最佳答案

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

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

关于java - 使用 JMS(特别是 ActiveMQ)时处理 JMSException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20955117/

相关文章:

java - 使用 Hibernate setFirstResult 无需任何排序

java - 线程中的异常 "main"java.lang.StringIndexOutOfBoundsException : String index out of range: -1

java - 企业级排队/消息系统何时取代更简单的工作流程管理系统?

java - 嵌入式ActiveMQ启动报错 : Temporary Store limit is 51200 mb

java - 安卓签名验证

Java客户端/服务器不通过Socket/ServerSocket进行通信

transactions - WSO2 中的 JMS 消费者事务

jms - 使用JMS连接到IBM MQ

java - ActiveMQ Broker RedeliveryPlugin 消息存储

java - 如何暂停和恢复 JMS 消息的异步消费