我正在使用带有线程的Apache lucene索引pdf文件。有些线程花费的时间超过15分钟。线程执行15分钟后,它会抛出Thread中断的Exception。有没有办法增加时间限制以避免这个问题。
当有一个线程运行时,我得到了这个异常,并且它将近76%的pdf文件编入索引。 应用程序服务器是Glassfish
List<Thread> threads = new ArrayList<Thread>();
Thread worker;
for (int a = 1;a <= count; a++) {
IndexManualRunnable indexManualRunnable =
new IndexManualRunnable(indexfileLocation, collections, manual, processId);
worker = new Thread(indexManualRunnable);
worker.setName(manual.getName());
worker.setPriority(Thread.MAX_PRIORITY);
worker.start();
threads.add(worker);
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException interruptedException) {
saveReport("", "", "Interrupted Exception", 1, processId, Category.INDEXING, thread.getName());
interruptedException.printStackTrace();
}
}
答案 0 :(得分:1)
<强>更新强>
我看到你正在使用Glassfish并且说每次15分钟都会发生这种中断。看起来Glassfish设置为在900秒左右超时,默认情况下为15分钟 - 这会引发InterruptException。
由于您的应用程序需要处理超过15分钟,因此请将以下服务器配置更新为您认为合适的时间限制。
http.request-timeout-seconds
这是一个用于更新属性的asadmin命令示例,但我还没有对其进行测试:
# asadmin set server-config.network-config.protocols.protocol.<listener-name>.http.request-timeout-seconds=-1
- NOTE: <listener-name> is the name of the listener they wish to disable the timeout on.
- (-1) means unlimited
要处理中断的线程,您可以自己捕获并处理异常。如果你想让线程继续执行,无论你理论上什么都不做 - 但为了保持代码清洁和正确,我将按如下方式实现:
boolean interrupted = false;
try {
while (true) {
try {
return queue.take();
} catch (InterruptedException e) {
interrupted = true;
// fall through and retry
}
}
} finally {
if (interrupted)
Thread.currentThread().interrupt();
}
我喜欢这个例子,因为它不只是留下一个空的catch子句,而是保留了它在一个布尔值中被调用的事实。它这样做,以便当它最终完成时,您可以检查它是否被中断,如果是这样,请尊重它并中断当前线程。
有关更多信息以及示例的来源,请参阅以下文章: http://www.ibm.com/developerworks/library/j-jtp05236/
答案 1 :(得分:0)
更改Glassfish中的domain.xml
<thread-pools>
<thread-pool name="http-thread-pool" idle-thread-timeout-seconds="1800" />
<thread-pool max-thread-pool-size="200" name="thread-pool-1" idle-thread-timeout-seconds="1800" />
</thread-pools>
增加idle-thread-timeout-seconds