如何解决释放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 举报,一经查实,本站将立刻删除。