我正在 Alfresco 中开发一些计划任务。其中一项任务应仅在某个日期属性早于固定天数的节点上运行。我研究了范围查询:date:[MIN TO NOW]
,但我不想使用现在,而是过去x天的日期。
这可以在查询中指定吗?
我正在 Alfresco 中开发一些计划任务。其中一项任务应仅在某个日期属性早于固定天数的节点上运行。我研究了范围查询:date:[MIN TO NOW]
,但我不想使用现在,而是过去x天的日期。
这可以在查询中指定吗?
嗨,是的,这很容易。让任务触发 Javascript。
只需做一些Javascript:
var days = 7;
var time = date.getTime();
var add = 86400000 * days;
var newDate = new Date(time - add);
var dateString = utils.toISO8601(newDate);
现在在查询中使用 dateString,例如"date:[MIN - " + dateString + "]"
计划任务在 Spring 配置文件中定义。ACronScheduledQueryBasedTemplateActionDefinition
执行查询并对每个结果执行操作。主要问题是向查询添加动态日期范围。
然而,它实际上并不是一个查询,而是一个查询模板,它是用 FreeMarker 处理的。用于处理模板的模型是由另一个 bean 创建的,TemplateActionModelFactory
.
我们的解决方案是对该工厂进行子类化,以便为模板提供更丰富的模型:添加了一个函数来计算动态日期范围:
public class CustomTemplateActionModelFactory extends FreeMarkerWithLuceneExtensionsModelFactory {
/**
* Function to calculate a date range based on the number of days in the past.
*/
private static class LuceneDateRangeOlderThanDays implements TemplateMethodModelEx {
@SuppressWarnings("rawtypes")
public Object exec(List args) throws TemplateModelException {
if (args.size() == 1) {
int days = ((TemplateNumberModel) args.get(0)).getAsNumber().intValue();
Date date = new Date(System.currentTimeMillis() - days * 24L * 3600 * 1000);
StringBuilder builder = new StringBuilder();
builder.append("[2001-01-01 TO ");
builder.append(DefaultTypeConverter.INSTANCE.convert(String.class, date));
builder.append("]");
return builder.toString();
} else {
throw new TemplateModelException("Invalid parameters.");
}
}
}
@Override
public Map<String, Object> getModel() {
// Extend the parent model with our custom function
Map<String, Object> model = super.getModel();
model.put("luceneDateRangeOlderThanDays", new LuceneDateRangeOlderThanDays());
return model;
}
}
在 Alfresco 存储库的 Spring 配置中,定义您自己的 TemplateActionModelFactory 并在其余配置中使用它。
<bean id="customTemplateActionModelFactory" class="com.db.cms.repository.util.DBTemplateActionModelFactory">
<property name="serviceRegistry">
<ref bean="ServiceRegistry" />
</property>
</bean>