Я проверил исходный код класса RMIAsynchronousCacheReplicator
http://www.jarvana.com/jarvana/view/net/sf/ehcache/ehcache-core/2.1.0/ehcache-core-2.1.0-sources.jar!/net/sf/ehcache/distribution/RMIAsynchronousCacheReplicator.java?format=ok
Что-то не так, когда вызывается flushReplicationQueue()
; он также должен проверять replicationQueue != null
, а не только replicationQueue.size() == 0
. Так же, как и для проверки потока alive()
в цикле while ...
Он не может очистить объект, если объект не существует или не инициализирован ... как он может знать, что объект пуст или нет, если он даже не существует или не инициализирован? Просто поймать NullPointerException
не очень хороший способ рассказать пользователю об этом!
/**
* RemoteDebugger method for the replicationQueue thread.
* <p/>
* Note that the replicationQueue thread locks the cache for the entire time it is writing elements to the disk.
*/
private void replicationThreadMain() {
while (true) {
// Wait for elements in the replicationQueue
while (alive() && replicationQueue != null && replicationQueue.size() == 0) {
try {
Thread.sleep(asynchronousReplicationInterval);
} catch (InterruptedException e) {
LOG.debug("Spool Thread interrupted.");
return;
}
}
if (notAlive()) {
return;
}
try {
if (replicationQueue.size() != 0) {
flushReplicationQueue();
}
} catch (Throwable e) {
LOG.error("Exception on flushing of replication queue: " + e.getMessage() + ". Continuing...", e);
}
}
}
Цель кода - просто избежать перехода времени простоя ЦП на 50%, когда поток ничего не делает в цикле while, что может заставить пользователя поверить, что с Encache что-то не так, если загрузка ЦП развивается примерно на 50%. все время ...
Возможно, вам нужно добавить свойство asynchronousReplicationInterval
с небольшим значением (от 100 мс до 150 мс), чтобы можно было построить очередь репликации. Добавьте его следующим образом:
properties="replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=true,
replicateRemovals=true,
asynchronousReplicationInterval=100"
Может потребоваться в конструкторе RMIAsynchronousCacheReplicator ниже:
/**
* Constructor for internal and subclass use
*/
public RMIAsynchronousCacheReplicator(
boolean replicatePuts,
boolean replicatePutsViaCopy,
boolean replicateUpdates,
boolean replicateUpdatesViaCopy,
boolean replicateRemovals,
int asynchronousReplicationInterval) {
super(replicatePuts,
replicatePutsViaCopy,
replicateUpdates,
replicateUpdatesViaCopy,
replicateRemovals);
this.asynchronousReplicationInterval = asynchronousReplicationInterval;
status = Status.STATUS_ALIVE;
replicationThread.start();
}
Может быть, вы можете на время игнорировать проблему и позволить кому-то еще сообщить об ошибке, если она даже считается ошибкой ... Интересно, почему она говорит "Продолжение ..." позже ...