在以下代码段中:
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
,而忽略诸如封闭的Session
或Connection
之类的东西:Message message=consumer.receive();
producer.send(message);
我想了解一般在JMS中应如何处理
JMSException
,但是特定于ActiveMQ的答案也很好。 (实际上,由于JMS只是一个规范,因此任何答案都可能必须特定于特定的实现。) 最佳答案
引发异常有多种原因。最常见的是由于网络或代理中断而导致连接丢失。其他原因可能是代理上的资源耗尽,违反安全性等。
为了避免由网络连接问题引起的异常,您可以使用ActiveMQ的故障转移传输来让客户端进行自动重新连接。 JMS中有许多异常类型,因此您可以测试给定的错误,例如检查是否由于安全异常而导致使用者创建者或生产者发送失败。如果您不知道实际原因,那么最常见的事情就是拆除并重建连接资源。这就是使用故障转移更好的原因,因为通过让客户端处理检测并响应此问题,您可以避免很多工作。