如何在portlet实例的所有用户之间共享数据?

时间:2014-01-13 09:24:59

标签: java session liferay portlet

我想在portlet实例的所有用户之间共享bean,但我不知道如何。

我正在开发一个(Liferay)portlet,它将为该portlet实例的每个用户提供许多有用的数据:在放置在页面上之后,portlet将从DB获取取决于其首选项的数据。我希望这个portlet将这些数据存储在RAM而不是首选项中,以避免从/转换为String。

我知道我可以将它存储在会话中,但这会为查看portlet的每个用户创建数据副本。结果:由于这个原因,我可能在RAM中有大量数据。 我不能使用上下文(或我的Portlet类中的局部变量),因为数据将在portlet的所有实例之间共享,我希望它特定于实例。

事实上,我希望它的工作方式与portlet的首选项一样,但是使用其他bean而不是字符串。

这是我想要的一个例子(说我的portlet正在显示内容列表,就像资产发布者一样):

  • 在页面上,我会放置两次portlet:一个显示所有事件,另一个显示所有博客条目
  • 设置首选项后,每个portlet实例都会获得一个内容列表并将其存储在RAM中
  • 当用户访问该页面时,将使用每个portlet实例的内容列表
  • 当另一个用户访问同一页面时,将使用相同的列表(“相同列表”,我的意思是相同的List实例,例如)

这是Portlet类的代码示例:

package com.test;

import com.liferay.portlet.asset.model.AssetEntry;
import com.liferay.util.bridges.mvc.MVCPortlet;

import java.io.IOException;
import java.util.List;

import javax.portlet.PortletException;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * Portlet implementation class NewPortlet
 */
public class NewPortlet extends MVCPortlet {
    @Override
    public void doView(RenderRequest renderRequest,
            RenderResponse renderResponse) throws IOException, PortletException {

        List<AssetEntry> entries = null;

        /*HERE : Get the entries from RAM (session/context/...)*/

        renderRequest.setAttribute("entries", entries);

        super.doView(renderRequest, renderResponse);
    }
    /*HERE : The methods containing code for preferences, setting "entries" to RAM, etc...*/
}

有谁知道该怎么做,或者这是不可能的?

2 个答案:

答案 0 :(得分:1)

阅读所有评论以及将数据存储在RAM中的要求,这听起来很像我的初步优化。

您是否这样做是因为您已经衡量了从其他来源读取数据的影响?如果你在这里谈论Liferay实体(博客文章等),那么它们实际上是被缓存的:如果你通过API检索它们,你很可能不会访问数据库而只是访问缓存而无需保留它们存在于内存中,有可能导致对基础数据的后续更改失去作用。

另外,如果你没有引用Liferay实体,你确定这是一个应该在portlet级别解决的问题吗?如果您有“业务级别”数据,您可能希望将它们放在业务层(可能是缓存的)中,并且只需通过ID引用它们 - 这些ID很容易存储在portlet首选项中。

技术信息:

由于门户网站首选项由门户网站存储 - 并且仅为字符串指定(实际bean会触发各种类加载问题) - 您对这种类型的限制是正确的。你想要坚持超越Strings的任何东西都必须由你自己处理。最有可能 - 正如我上面所说 - 这最适合业务层,而不是UI。

答案 1 :(得分:0)

我认为更好的方法是将portlet特定数据放入portlet首选项。您可以配置特定于布局的portlet首选项:

付诸liferay-portlet.xml

Set <preferences-unique-per-layout> false</preferences-unique-per-layout>

有关详情,请参阅liferay-portlet.dtd

的说明
<!--
Set the preferences-unique-per-layout value to true if the preferences for the
portlet are unique across all pages. If set to false, the preferences for the
portlet are shared across all pages. The default value is true.

The preferences-unique-per-layout element is used in combination with the
preferences-owned-by-group element. See the comments for the
preferences-owned-by-group element for more information.
-->