释放Apache Ignite中的锁时发生IllegalMonitorStateException

问题描述

我正在使用ignite 2.8.1,我在某些cron中具有ignite锁,我仅使用它在单个服务器节点上运行处理。我的应用程序中有3个服务器节点。

今天,我看到了一些例外。您能解释一下怎么发生吗?似乎是在unlock()时发生的,但是奇怪的是,如果它在tryLock()内,怎么可能不拥有锁?

<ignite-sys-atomic-cache@default-volatile-ds-group> Lock.unlock() is called in illegal state [callerNodeId=ee0de9a9-5a13-4971-a744-dcc5087fd287,ownerNodeId=a2bba513-9ed7-4dc3-beea-574bf46f0034,callerThreadId=674,ownerThreadId=672,lockState=1]

蚂蚁踪迹:

        java.lang.IllegalMonitorStateException: null at org.apache.ignite.internal.processors.datastructures.GridCacheLockImpl$Sync.tryRelease(GridCacheLockImpl.java:446) at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.release(AbstractQueuedSynchronizer.java:1261) at 
    org.apache.ignite.internal.processors.datastructures.GridCacheLockImpl.unlock(GridCacheLockImpl.java:1258) at com.sa.sm.vp.service.LockUtil.unlock(LockUtil.java:35) at 
com.sa.sm.vp.service.content.SessionExpirator.triggerExpirationEvent(SessionExpirator.java:78) at 
 
com.sa.sm.vp.service.content.SessionExpirator$$FastClassBySpringcglib$$ac2d1b1f.invoke(<generated>) at
     org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at 
org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:771) at 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at 
    org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749) at 
    org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88) at 
    io.opentracing.contrib.spring.cloud.scheduled.ScheduledAspect.traceBackgroundThread(ScheduledAspect.java:57) at 
    sun.reflect.GeneratedMethodAccessor117.invoke(UnkNown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroun

代码

private IgniteSpringBean igniteSpringBean;

    @Scheduled(initialDelay = 20000,fixedDelay = 4000)
    @Timed
    public void triggerExpirationEvent() {
        IgniteLock lock = igniteSpringBean.reentrantlock("PLAYBACK_SESSION",true,true);
        if (lock.tryLock()) {
            try {
                        // do my work in separate thread
                       // timeout
                    try {
                        TimeUnit.MICROSECONDS.sleep(2000);
                    } catch (InterruptedException e) {
                        log.warn("Failed to sleep ",e);
                    }
                }
            } finally {
                lock.unlock()
            }
        }
    }

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)