我是否只是遗漏了一些明显的东西,或者没有合理或中途可行的方法在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的任何人都知道吗?
答案 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();
}