背景: DeltaManagerを使用してクラスタ化されたTomcat7インスタンスで動作するLiferay 6.2.GA6のポートレットとしてVaadin 7アプリケーションを実行しています。Vaadinリクエスト内でLiferayのAPPLICATION_SCOPEに属性を設定するにはどうすればよいですか
私のVaadinアプリケーションで他のポートレットが表示できる適切なユーザーレベルのセッション属性を設定しようとしています。
以下のコードではスレッドデッドロックが発生します。
'
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の呼び出しは、すでに(種類-の)デッドロックどの成り立つセッションVaadinのロックを試みることDeltaSessionをトリガーすることが表示されます。
VaadinはVaadinSessionまたはUI.access()を使用することを提案しています。これは助けにはなりません。
私の次のアイデアは、VaadinSessionを手動でアンロックし、属性を設定してからVaadinSessionを再ロックすることです。これは危険な動きのようです。
解決方法をお勧めする人はいますか?