2014-01-06 34 views
1

在下面的代码片段:使用JMS处理JMSExceptions,特别是ActiveMQ?

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); 

我想了解如何JMSException S的关系在JMS一般进行处理,但具体的答案到ActiveMQ也很好。 (事实上​​,很可能任何答案都必须针对特定实现,因为JMS只是一个规范。)

回答

1

由于多种原因,可能会抛出异常。最常见的情况是,由于网络或经纪人失败,连接丢失。其他原因可能是代理资源耗尽,安全违规等。

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

+0

精彩的回答。正是我需要知道的。谢谢蒂姆! – sigpwned