Coordination Between Vaadin Portlet Application Across Pages


Java Portlet Specification
describes how to setup the Liferay Server to enable inter-portlet communication across pages.

I downloaded their samples and successfully managed to setup my environment to verify this communication behavior.

Using two Vaadin application portlets however throws a “Session expired” exception.

My questions:

  • Does Vaadin support inter-portlet communication across pages?

  • If yes, is their something more to add to the configuration setup as described in the above document?

Thanks for any hint!

For clarification: same portlet communication is working on the same page without any problems!

Are you using shared render parameters or portlet events (or both) for the communication?
Are the two portlets running the same application (in which case you should override Application.getWindow() - search on the forum), separate applications from the same WAR or from different WARs?
Are they sharing the session?

Also, there could be some other exception in the background that is triggering the “Session expired” notification (maybe from your test application, maybe from Vaadin or Liferay). Information on what that exception is and from where it comes could be very useful.

More detailed information on the issue and a sample on how to reproduce it would help, although I might not get around to looking into it in detail right now.

If you do get it to work, I believe an example would be welcome also in
this thread
.

Thanks for the prompt response.

I will provide a simple example as soon as possible. Need to strip down the application we are using actually!

Back to your questions:

  • We are using only events. No shared parameters!

  • The Vaadin applications are deployed within separate WAR files

  • No sharing of sessions

May this gives you already a hint :wink:

I’ll come back with an example.

Here is the example. The use-case implemented is a simple producer-consumer application.

All zip-files are Eclipse projects.

PortletEventCommon.zip: Here you will find the definition of the portlet event, which should be known by both other applications. You have to create a jar-file (just use eclipse export feature) and place the jar-file into directory LIFERAY_HOME/tomcat-6.0.26/lib/ext. It will be loaded now by the shared class loader.

PortletEventConsumer.zip: Here you will find the consumer application. Create a war-file and deploy it into liferay the usual way.

PortletEventProducer.zip: Here you will find the producer application. Create a war-file and deploy it into liferay the usual way.


IMPORTANT
: Before deploying these applications you need the configure liferay to support event distribution between different pages, which is off by default. Add following lines to the file portal-ext.properties

portlet.event.distribution=ALL_PORTLETS
portlet.public.render.parameter.distribution=ALL_PORTLETS
portlet.event.max.generation=3

I have tested this sample app in liferay-5.2.3 and liferay-6.0.26.

liferay-6.0.26 is doing well. IPC is working if both apps are on the same page and on different pages.

liferay-5.2.3 has no problems if both apps are on the same pages. However above configuration for portal-ext.properties does not work if the portlets are on different pages, due to the wrong portlet container which isn’t sun’s implementation by default. Adding the line to portal-ext.properties

portlet.container.impl=sun

redeploying the portlets, adding them on different pages and pushing the button produces the following exception:

Session has expired
com.vaadin.terminal.gwt.server.SessionExpiredException
at com.vaadin.terminal.gwt.server.AbstractApplicationPortlet.findApplicationInstance(AbstractApplicationPortlet.java:805)
at com.vaadin.terminal.gwt.server.AbstractApplicationPortlet.handleRequest(AbstractApplicationPortlet.java:355)
at com.vaadin.terminal.gwt.server.AbstractApplicationPortlet.processEvent(AbstractApplicationPortlet.java:580)
at com.sun.portal.portletcontainer.appengine.PortletAppEngineServlet.service(PortletAppEngineServlet.java:323)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.sun.portal.portletcontainer.appengine.PortletAppEngineFilter.doFilter(PortletAppEngineFilter.java:105)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:535)
    at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:472)
    at com.sun.portal.portletcontainer.impl.PortletContainer.invokePAE(PortletContainer.java:819)
    at com.sun.portal.portletcontainer.impl.PortletContainer.invokePAE(PortletContainer.java:694)
    at com.sun.portal.portletcontainer.impl.PortletContainer.executeEvent(PortletContainer.java:640)
    at com.sun.portal.portletcontainer.impl.PortletContainer.processEvent(PortletContainer.java:551)
    at com.sun.portal.container.service.coordination.impl.CoordinationServiceImpl.publishEventInterna

(CoordinationServiceImpl.java:274)
at com.sun.portal.container.service.coordination.impl.CoordinationServiceImpl.publishEvent(CoordinationServiceImpl.java:103)
at com.sun.portal.portletcontainer.impl.PortletContainer.executeAction(PortletContainer.java:353)
at com.liferay.portal.portletcontainer.WindowInvoker.invokeAction(WindowInvoker.java:273)
at com.liferay.portlet.InvokerPortletImpl.processAction(InvokerPortletImpl.java:359)
at com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:604)
at com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:428)
at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:195)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)

    at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
    at com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:157)

    at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
    at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
    at com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:608)
    at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:846)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
    at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java436)
    at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
    at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
    at com.liferay.portal.servlet.FriendlyURLServlet.service(FriendlyURLServlet.java:143)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:142)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:94)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java:140)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:282)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:94)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.cache.CacheFilter.processFilter(CacheFilter.java:425)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.processFilter(AutoLoginFilter.java:257)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.sso.opensso.OpenSSOFilter.processFilter(OpenSSOFilter.java:73)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:193)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.doFilter(VirtualHostFilter.java:191)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.servlet.filters.threadlocalcache.ThreadLocalCacheFilter.processFilter(ThreadLocalCacheFilter.java:55)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:91)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:154)
    at com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:94)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Thread.java:619)

Here are the files as attachments
11355.zip (2.49 KB)
11356.zip (5.42 MB)
11357.zip (6.84 MB)

Hi guys,

I am facing the same problem on Websphere Portal. Did you find a solution?

I have 2 portlets deployed in 2 different wars and placed on 2 different portal pages. One Portlet produces a JSR-286 event.
The other portlet placed on a different portal page is supposed to consume the event.

I am getting “Session Expired” too. I think the problem is server-independant. It seems to be an implementation miss.

Because I noticed the following behaviour. If you just login and produce the event, the consumer portlet is not initialized and session is null.
But if you first open the page with the consumer portlet and THEN produce the event. You won’t get “Session Expired” anymore as the session of the 2nd portlet has been initialized.

So the solution here is maybe to check in Vaadin default portlet implementation why the portlet has been called.
If it was an event request like in this case → a new Vaadin application must be initialized, the same thing that happens when you just open the page with that portlet.