Текущая тема не является владельцем замка!Hazelcast - PullRequest
0 голосов
/ 03 июля 2019

У меня есть загрузочное приложение Spring, в котором есть Hazelcast для кэширования.Когда несколько экземпляров кластеризованы с помощью Hazelcast, у меня возникает следующее исключение при операции разблокировки:

java.lang.IllegalMonitorStateException: Current thread is not owner of the lock! -> Owner: 33ce48f8-dda3-471f-abae-994d25dcc030, thread ID: 55
    at com.hazelcast.concurrent.lock.operations.UnlockOperation.unlock(UnlockOperation.java:75) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.concurrent.lock.operations.UnlockOperation.run(UnlockOperation.java:64) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.Operation.call(Operation.java:170) ~[hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.call(OperationRunnerImpl.java:208) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:197) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationservice.impl.OperationRunnerImpl.run(OperationRunnerImpl.java:413) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:153) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.process(OperationThread.java:123) [hazelcast-3.11.4.jar!/:3.11.4]
    at com.hazelcast.spi.impl.operationexecutor.impl.OperationThread.run(OperationThread.java:110) [hazelcast-3.11.4.jar!/:3.11.4]

Вот мой компонент, в котором я выполняю операции блокировки и разблокировки:

package com.companyname.service.servicename.job;
import com.hazelcast.core.ILock;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class UpdateRaceCacheJob {

    @Scheduled(fixedDelay = 10000)
    public void updateRaceCache() {
        ILock lock = hazelcastInstance.getLock("race-lock");
        try {
            if (!lock.tryLock()) {
                return;
            }

            // service calls

        } finally {
            lock.unlock();
        }
    }
}

Когда язаменить lock.unlock (); строка на:

if (lock.isLockedByCurrentThread()) {
    lock.unlock();    
}

Я получаю предупреждение от сонара: Разблокировать эту блокировку на всех путях выполнения этого метода.

Спасибо!

1 Ответ

2 голосов
/ 03 июля 2019

Поскольку блокировки Hazelcast распределены, они защищены владением потоком, поэтому разблокировать может только тот, кто его заблокировал.

В вашем коде вы используете tryLock, который может вернуть false. Однако блок finally выполняет операцию разблокировки в любом случае. Таким образом, каждый раз, когда вы не можете получить блокировку (поскольку она заблокирована каким-либо другим потоком в кластере), вы попытаетесь разблокировать ее, и вы получите это исключение.

Рекомендуется использовать lock.isLockedByCurrentThread() для проверки прав собственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...