我在重启 Jetty 后遇到了异常,它包含通过 MapDB 的队列实现的生产者-消费者。我没有调用“DBMaker.transactionDisable()”,但是为什么还是会出现上述异常?
在我重新启动 Jetty 之前,我发现消费者似乎被阻止了。通过 jstack 命令,我得到了很多以下日志:
“qtp1730704097-270”#270 prio=5 os_prio=0 tid=0x00007f7b60006800 nid=0xb44f 等待条件 [0x00007f7986ae9000]
java.lang.Thread.State: TIMED_WAITING (parking) at sun.misc.Unsafe.park(Native Method) - 在 java.util 中等待 <0x000000054047c420> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) .concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) at org.eclipse.jetty.util.BlockingArrayQueue.poll(BlockingArrayQueue .java:342) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.access$600(QueuedThreadPool.java:44) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.idleJobPoll(QueuedThreadPool.java:526) 在 org .eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:572) 在 java.lang.Thread.run(Thread.java:745)锁定的可拥有同步器: - 无
以下是一些代码片段:
// Consumer code:
public void run() {
try {
while (!stopped) {
if (System.currentTimeMillis() - lastCheckTime > 60000) {
localDb.commit();
localDb.compact();
lastCheckTime = System.currentTimeMillis();
}
...
for (...) {
queue.poll();
}
...
localDb.commit();
}
localDb.commit();
localDb.compact();
} catch (InterruptedException ie) {
LOG.error("", ie);
}
}
// Others code:
...
DB localDb = DBMaker.newFileDB(new File(path)).closeOnJvmShutdown().make();
localDb.catPut(QUEUE_NAME + ".useLocks", false);
queue = localDb.getQueue(QUEUE_NAME);
...
public void interrupt() {
stopped = true;
localDb.close();
}
java -版本:java版本“1.8.0_11”
谢谢!