Я использую Hazelcast 3.8.3. Иногда у меня возникает операция TimeoutException (GetOperation). У меня есть 4 узла в одном и том же кластере Hz.
Ошибка выброса приложения. Причина: java .util.concurrent.ExecutionException: com.hazelcast.core.OperationTimeoutException: не удалось завершить вызов GetOperation из-за операции -heartbeat-тайм-аут. Текущее время: 2020-04-23 19: 17: 37.414. Время начала: 2020-04-23 19: 14: 16.456. Общее прошедшее время: 200958 мс. Пульс последней операции: никогда. Пульс последней операции от участника: 2020-04-23 19: 16: 59.335. Invocation {op = com.hazelcast.map.impl.operation.GetOperation {serviceName = 'hz: impl: mapService', identityHash = 300649867, partitionId = 30, replicaIndex = 0, callId = -10707, invocationTime = 1587665497325 (2020-04 -23 19: 11: 37.325), waitTimeout = -1, callTimeout = 180000, name = ENRICHMENT-CACHE-DEFAULT}, tryCount = 250, tryPauseMillis = 500, invokeCount = 1, callTimeoutMillis = 180000, firstInvocationTimeMs = 1587665654456 2020-04-23 19: 14: 16.456 ', lastHeartbeatMillis = 0, lastHeartbeatTime =' 1970-01-01 01: 00: 00.000 ', цель = [10.195.40.212]: 5701, pendingResponse = {VOID}, backupsAcksExpected = 0 , backupsAcksReceived = 0, connection = Connection [id = 56, /10.195.40.210:5702->/10.195.40.212:60231, конечная точка = [10.195.40.212]: 5701, жив = true, тип = MEMBER]} в java .util.concurrent.FutureTask.report (Неизвестный источник) в java .util.concurrent.FutureTask.get (Неизвестный источник) в com.experian.eda.ea.core.enrichmentpack.MultiThreadEnrichmentPackManager.evaluateAllPreEnith hmentPackManager. java: 123) ... пропущено 90 общих кадров. Причина: com.hazelcast.core.OperationTimeoutException: не удалось завершить вызов GetOperation из-за тайм-аута операции heartbeat-timeout. Текущее время: 2020-04-23 19: 17: 37.414. Время начала: 2020-04-23 19: 14: 16.456. Общее прошедшее время: 200958 мс. Пульс последней операции: никогда. Пульс последней операции от участника: 2020-04-23 19: 16: 59.335. Invocation {op = com.hazelcast.map.impl.operation.GetOperation {serviceName = 'hz: impl: mapService', identityHash = 300649867, partitionId = 30, replicaIndex = 0, callId = -10707, invocationTime = 1587665497325 (2020-04 -23 19: 11: 37.325), waitTimeout = -1, callTimeout = 180000, name = ENRICHMENT-CACHE-DEFAULT}, tryCount = 250, tryPauseMillis = 500, invokeCount = 1, callTimeoutMillis = 180000, firstInvocationTimeMs = 1587665654456 2020-04-23 19: 14: 16.456 ', lastHeartbeatMillis = 0, lastHeartbeatTime =' 1970-01-01 01: 00: 00.000 ', цель = [10.195.40.212]: 5701, pendingResponse = {VOID}, backupsAcksExpected = 0 , backupsAcksReceived = 0, connection = Connection [id = 56, /10.195.40.210:5702->/10.195.40.212:60231, конечная точка = [10.195.40.212]: 5701, жив = true, тип = MEMBER]} в com. hazelcast.spi.impl.operationservice.impl.InvocationFuture.newOperationTimeoutException (InvocationFuture. java: 151) в com.hazelcast.spi.impl.operationservice.impl.InvocationFuture.resolve (InvocationFuture. java: 101 at). hazelcast.spi.impl.opera ionservice.impl.InvocationFuture.resolveAndThrowIfException (InvocationFuture. java: 75) по адресу com.hazelcast.spi.impl.AbstractInvocationFuture.get (AbstractInvocationFuture. java: 155) по адресу com.hazelcast.map.impap.Proxy.map.impap. invokeOperation (MapProxySupport. java: 373) в com.hazelcast.map.impl.proxy.MapProxySupport.getInternal (MapProxySupport. java: 304) в com.hazelcast.map.impl.proxy.MapProxyImpl.get (MapProxyImpl. java: 114)
Вот настройка, которую я использую.
<map name="ENRICHMENT-CACHE-*">
<in-memory-format>BINARY</in-memory-format>
<backup-count>0</backup-count>
<max-idle-seconds>600</max-idle-seconds>
<eviction-policy>LRU</eviction-policy>
<max-size policy="PER_NODE">5000</max-size>
<eviction-percentage>25</eviction-percentage>
</map>
<properties>
<property name="hazelcast.logging.type">slf4j</property>
<property name="hazelcast.client.invocation.timeout.seconds">360</property>
<property name="hazelcast.operation.call.timeout.millis">180000</property>
</properties>
Я вижу, код написан таким образом.
@Override
public final V get() throws InterruptedException, ExecutionException {
Object response = registerWaiter(Thread.currentThread(), null);
if (response != VOID) {
// no registration was done since a value is available.
return resolveAndThrowIfException(response);
}
boolean interrupted = false;
try {
for (; ; ) {
park();
if (isDone()) {
return resolveAndThrowIfException(state);
} else if (Thread.interrupted()) {
interrupted = true;
onInterruptDetected();
}
}
} finally {
restoreInterrupt(interrupted);
}
}
Текущий поток припаркован, ожидая прерывания. Может ли быть исключение тайм-аута сердцебиения, прервавшего поток и разбудившего его в ошибочном состоянии? Если да, поможет ли приращение hazelcast.max.no.heartbeat.seconds?
Если это не так, знаете ли вы, почему произошла ошибка и как ее устранить?
Спасибо.
С уважением, Хайрул