Liferay MVCPortlet上的并行portlet实例不是独立的

时间:2013-12-13 09:39:27

标签: ajax jsp liferay portlet

我正在尝试在Liferay 6.1.1上使用基于MVCPortlet的portlet,它的行为并不像我期望的那样。我的portlet应该是独立的,但不是......

我的需要:

  • 我有第一个带有表单的portlet。
  • 我有几个基于MVCPortlet的portlet B实例。

提交表单时,portlet A会启动一个事件,所有portlet B都会收到此事件。当portlet B收到事件时,它必须构建一个URL,连接到它并从中读取数据,并显示结果。

我的B portlet基于MVCPortlet,是可实现的,可执行的,渲染权重为0,用于并行处理和显示portlet B的所有实例。

但它效果不好:

1)我无法在事件处理中处理URL,因为所有事件接收(我的portlet B的每个实例一个)都在同一个线程中处理。因此,在我刚设置renderRequest参数的情况下,jsp页面会自动使用ActionURL来调用我的portlet中的动作处理。

此操作构建URL,使用它,处理数据并重定向到结果显示页面(response.setRenderParameter(“jspPage”,“/ html / display / results.jsp”))。

2)我期待每个portlet独立于另一个,但它们不是。所有portlet共享的MVCPortlet只有一个实例,这让我大吃一惊。我的所有portlet实例也共享portlet会话。 action方法由不同的线程执行,这很好,但是portlet的呈现可以通过其他portlet的动作处理来阻止。一个portlet可以激发整个页面刷新。所有我想避免的事情都是通过实例化,ajaxable和渲染权重与0 ...

我想知道是否有错误,如果只有一个类的实例扩展MVCPortlet等是正常的,或者是否有最好的方法来获得所需的行为。

1 个答案:

答案 0 :(得分:0)

1)我不完全确定你在这里做了什么:事件处理在并行性方面是未定义的AFAIK,所以在同一个线程中顺序处理所有事件是正常的行为。但是,我不明白你的描述中的ActionURL部分是什么意思。您可以在事件处理程序中更改portlet的状态,但不能在呈现阶段更改。通常,每个请求只处理一个操作,多个(必要时)事件,然后呈现所有portlet。你是否意味着每个B-portlet上都会有一个动作?这是意料之外的,我宁愿建议你在事件处理程序中进行处理,或者在继续事件处理时触发它在后面异步运行(特别是当需要时间时)

2)portlet彼此独立,但并非每个portlet都映射到单个Java对象。事实上,实现就像在servlet世界中一样:只有一个对象不应该有任何状态。 portlet(或servlet)中几乎所有成员变量实例都是误解API的标志:portlet的整个状态是通过各种PortletRequest和PortletResponse对象进入的,portlet成员变量中不应保留任何内容。

根据您异步呈现所有B portlet的意图,我假设渲染可能需要一段时间 - 事件处理应该尽快继续。否则,如果整个结果已经存在,那么异步渲染是没有意义的。