Обновление время жизни блокировки Hazelcast
Возможно ли более правильно обновлять время жизни блокировки hazelCast ? есть первый метод который принимает некий Consumer, в процессе выполнения метода будет выполняться в цикле некое действие которое на первом своем шаге будет вызывать метод 2, который будет обновлять блокировки
Метод 1 - ставим внутри tryLockSafe FencedLock на 5 минут, и добавляем блокировку в ExternalCache на 1 минуту, после чего вызываем Action
public boolean doInDoubleLockOnOneMinute(String monitor, Consumer<String> action) {
if (tryLockSafe(monitor)) {
try {
if (!recordsIsUnderProcessMap.getOrDefault(monitor, false)) {
recordsIsUnderProcessMap.put(monitor, true);
recordsIsUnderProcessMap.setTtl(monitor, Const.ONE_INT, DEFAULT_TIME_UNIT);
if (action != null) {
action.accept(monitor);
}
return true;
}
} catch (Throwable thr) {
throw new HazelcastException(thr);
} finally {
unlock(monitor);
}
}
return false;
}
Метод 2 проверяем что в кеше есть запись о блокировке (если нет прерываем процесс), после обновляем время жизни этой записи (чтобы не потерялась пока блокировку снимаем/ставим). Смущает, что есть некая пауза между снятием и установкой, когда полагаемся на ExternalCache- можно ли это сделать в одной транзакции? `
public void checkLockAndUpdateTTL(String monitor) {
try {
if (recordsIsUnderProcessMap.get(monitor)) {
recordsIsUnderProcessMap.setTtl(monitor, Const.ONE_INT, DEFAULT_TIME_UNIT);
FencedLock lock = HazelcastInst.getInstance().getCPSubsystem().getLock(monitor);
// снимаем и добавляем лок заново, для обновления TTL, в это время полагаемся на ExternalCache, который только что проверили и обновили
lock.unlock();
if (!tryLock(monitor)) {
throw new CBSException(new CBSInfoCodes.UpdateLockException());
}
} else {
throw new CBSException(new CBSInfoCodes.BlockProcessNotFoundException());
}
} catch (Throwable ex) {
throw new CBSException(new CBSInfoCodes.UpdateLockException());
}
}`