2016-12-05 65 views
0

某些背景;我正在運行一個Vaadin 7應用程序作爲Liferay 6.2.GA6上使用DeltaManager在羣集Tomcat7實例上運行的portlet。如何在Vaadin請求中設置Liferay的APPLICATION_SCOPE中的屬性

我試圖在我的Vaadin應用程序中設置一個用戶級會話屬性,其他portlet可以查看並做出適當的反應。

下面的代碼導致線程死鎖。

'  
PortletSession session = ((WrappedPortletSession)UI.getCurrent().getSesion()).getPortletSession(); 
session.setAttribute("CURRENT_NOTIFICATION",notificationDTO,PortletSession.APPLICATION_SCOPE); 

我得到的縮寫線程轉儲...

"http-nio-8081-exec-80" - Thread [email protected] 
    java.lang.Thread.State: WAITING 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting to lock <7c3f1e38> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync) owned by "http-nio-8081-exec-82" [email protected] 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197) 
    at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:945) 
    at org.apache.catalina.ha.session.DeltaSession.lock(DeltaSession.java:199) 
    at org.apache.catalina.ha.session.DeltaSession.setAttribute(DeltaSession.java:726) 
    at org.apache.catalina.ha.session.DeltaSession.setAttribute(DeltaSession.java:711) 
    at org.apache.catalina.session.StandardSessionFacade.setAttribute(StandardSessionFacade.java:154) 
    at com.liferay.portlet.PortletSessionImpl.setAttribute(PortletSessionImpl.java:188) 
    at mypackage.com.view.NotificationEntryView.enter(NotificationEntryView.java:181) 


    "http-nio-8081-exec-82" - Thread [email protected] 
    java.lang.Thread.State: WAITING 
    at sun.misc.Unsafe.park(Native Method) 
    - waiting to lock <fa6510c> (a java.util.concurrent.locks.ReentrantLock$NonfairSync) owned by "http-nio-8081-exec-80" [email protected] 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:834) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:867) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1197) 
    at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:214) 
    at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:290) 
    at com.vaadin.server.VaadinSession.writeObject(VaadinSession.java:1432) 
    at sun.reflect.GeneratedMethodAccessor1827.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:988) 
    at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1495) 
    at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1431) 
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1177) 
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:347) 
    at org.apache.catalina.ha.session.DeltaRequest$AttributeInfo.writeExternal(DeltaRequest.java:407) 
    at org.apache.catalina.ha.session.DeltaRequest.writeExternal(DeltaRequest.java:300) 
    at org.apache.catalina.ha.session.DeltaRequest.serialize(DeltaRequest.java:314) 
    at org.apache.catalina.ha.session.DeltaManager.serializeDeltaRequest(DeltaManager.java:610) 
    at org.apache.catalina.ha.session.DeltaManager.requestCompleted(DeltaManager.java:996) 
    - locked <5603aa01> (a org.apache.catalina.ha.session.DeltaRequest) 

看來,在PorletSession的的setAttribute調用觸發DeltaSession嘗試在會話這Vaadin的鎖已經(一種-的)持有這會造成死鎖。

Vaadin建議使用VaadinSession或UI.access()。這並沒有幫助。

我的下一個想法是手動解鎖VaadinSession,設置屬性,然後重新鎖定VaadinSession,這似乎是一個冒險的舉動。

任何人都可以推薦一個解決方案嗎?

回答

0

在設置用戶會話屬性之前解鎖VaadinSession似乎解決了死鎖問題,並且重新鎖定VaadinSession也似乎可行。

所以問題現在有點解決了。