1

我在重启 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”

谢谢!

4

0 回答 0