Liferay:消息的到期日期(留言板)

时间:2012-05-03 17:44:04

标签: java liferay

我是否只是遗漏了一些明显的东西,或者没有合理或中途可行的方法在Liferay的留言板中为消息添加过期日期?

第一个问题是如何在消息编辑器中输入到期日期。最明显的解决方案可能是expando属性,但似乎没有日期的expando数据类型(只有日期和时间),我发现无法在expando属性中设置计算的默认值(例如今天+ 6个月) 。即使没有默认值,日期+时间属性默认为1970年1月1日,0:00GMT并使用日期选择器输入实际到期日期相当繁琐。输入到期日后,没有明显的方法来验证它(例如将其限制为今天和今天之间的日期+ 6个月),并且当日期显示在消息视图中时,当前区域设置不用于格式化日期和时间。

即使我以某种方式设法将到期日期压缩到expando属性中,也没有明显的方法来评估到期日期。

消息仍然是持久的,但不计入并显示在MB portlet中,这是可以接受的。然而,MBThreadServiceUtil中访问消息的方法没有提供任何额外的过滤标准,所以我要么加载所有消息并在Java代码中执行计数/过滤操作(几乎不是一个非常聪明的解决方案),否则我将不得不重写整个服务堆栈“自下而上”并添加get或search方法,这些方法能够将过滤转发到数据库。

首选解决方案是拥有一个计划任务,该任务会定期完全删除过期的消息。由于MB portlet支持作用域(消息与portlet的作用域相关),并且计划任务不在portlet上下文中运行,因此我必须以某种方式访问​​作用域id。如果我理解有关此主题的文档和可用讨论,则默认范围应该是页面所属的社区。另一方面,我们的“留言板页面”在组织级别上添加,并且消息的范围ID与组织ID或组织中任何社区的ID都不匹配。在这种情况下,有关如何确定范围ID的任何人都知道吗?

1 个答案:

答案 0 :(得分:1)

我想用预定的任务 - liferay用于Quartz; http://liferaysnippets.com/how-to-create-cron-job-in-liferay/

您可以使用DynamicQueries保存的过期消息:

    Calendar c = Calendar.getInstance();
    c.add(Calendar.MONTH, -6);
    Date halfYearAgo = c.getTime();
    ClassLoader portalClassLoader = PortalClassLoaderUtil.getClassLoader();
    DynamicQuery query = DynamicQueryFactoryUtil.forClass(MBThread.class, portalClassLoader)
            .add(PropertyFactoryUtil.forName("lastPostDate").le(halfYearAgo)).addOrder(OrderFactoryUtil.asc("lastPostDate"));

    try {
        List dynamicQuery = MBThreadLocalServiceUtil.dynamicQuery(query);
        for (Object object : dynamicQuery) {
            MBThread thread = (MBThread) object;
            MBThreadLocalServiceUtil.deleteMBThread(thread);
        }
    } catch (SystemException e) {
        e.printStackTrace();
    }