正如标题所示,我在while(true)
无限循环中包含了一些代码,所有这些代码都被try
和catch
块完全捕获。这个线程是在main方法中启动的,但是,经过长时间的运行,当我使用jstack检查并导致工作累积时,这个工作线程会神秘地消失。
以下是我的代码:
public void run() {
while (true) {
try {
// Consumer consumes from Kafka server
Global.KAFKA_METRIC_DATA_CONSUMER.consume(topic, handler);
} catch (Exception e) {
logger.error("Kafka consumer process was interrupted by exception!");
} finally {
try {
// Prevent restart too often
Thread.sleep(30 * BaseConst.SECOND);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
根据我的理解,这个结构将保持线程运行,因此是消费者。即使consume()方法失败,它也会无限重启。但是,正如我上面提到的,整个线程无声地消失,没有任何错误日志。有人能提供一些线索吗?
可能有用的更多信息:
答案 0 :(得分:9)
OutOfMemoryError不是例外。这是一个源自Throwable的错误。
如果在consume(topic, handler)
的某个地方抛出了它,最后仍会被调用,延迟不可避免的大约30秒......但在此之后错误将向上传递并且你的循环将被终止。
答案 1 :(得分:1)
您正在抓住Exception
,因此可能会抛出java.lang.Error
或java.lang.Throwable
(例如OutOfMemoryError)
如果你真的想抓住所有东西,你需要抓住Throwable
而不仅仅是Exception
子类。
答案 2 :(得分:0)