Alfresco trashcanCleaner 作业未在预设时间触发
Alfresco trashcanCleaner job triggered not at preset time
我正在 Tomcat7 上的 Alfresco one 5.0.0.3 运行 上测试 trashcanCleaner 模块。
问题出在清理动作的触发时间上。
清理动作的预设时间是每天04:00,保护天数设置为1。昨晚(2015/03/26)在18:10我上传了一些文件到存储库随后删除了大约 minites。根据配置,我刚刚删除的这些文件应该在垃圾桶中保留 1 天。但是今天(2015/03/27)早上10:00左右我发现那些文件已经被trashcanCleaner删除了,trashcanCleanerclass的日志如下:
2015-03-27 07:31:08,717 DEBUG [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] Trashcan cleaner query :
2015-03-27 07:31:09,139 DEBUG [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] @\{http\://www.alfresco.org/model/system/1.0\}archivedDate:[1970-01-01T00:00:00.000Z TO 2015-03-26T06:31:08.717Z]
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] Trashcan Cleaner is about to purge the following items :
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file1
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file2
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file3
从上面的日志来看,清洁器似乎是在 2015-03-27 07:31:08 触发的,这与 04:00 的预设不同,并且这些文件在垃圾桶中没有停留 1一天呢。
我对 lucene 搜索系统中设置的时间和 Alfresco 的存储库时间计算感到很困惑。
归档数据(删除时间)计算方法
下面是获取节点删除的主要代码:
public void execute() {
if (this.protectedDays > 0) {
Date fromDate = new Date(0L);
Date toDate = new Date(new Date().getTime() - 86400000L * Long.valueOf(this.protectedDays).longValue());
if (toDate == null) {
throw new RuntimeException("Error while building the query.");
}
String strFromDate = ISO8601DateFormat.format(fromDate);
String strToDate = ISO8601DateFormat.format(toDate);
StringBuilder buf = new StringBuilder(128);
buf.append("@").append(Repository.escapeQName(ContentModel.PROP_ARCHIVED_DATE))
.append(":").append("[").append(strFromDate)
.append(" TO ").append(strToDate).append("] ");
String query = buf.toString();
SearchParameters sp = new SearchParameters();
sp.setLanguage("lucene");
sp.setQuery(query);
NodeRef archiveRootRef = this.nodeArchiveService.getStoreArchiveNode(Repository.getStoreRef());
sp.addStore(archiveRootRef.getStoreRef());
if (logger.isDebugEnabled()) {
logger.debug("Trashcan cleaner query : ");
logger.debug(query);
}
UserTransaction tx = null;
ResultSet results = null;
try {
tx = this.transactionService.getNonPropagatingUserTransaction(false);
tx.begin();
results = this.searchService.query(sp);
List<NodeRef> deletedItemsToPurge = results.getNodeRefs();
if (logger.isInfoEnabled()) {
logger.info("Trashcan Cleaner is about to purge the following items :");
for (NodeRef item : deletedItemsToPurge) {
String itemName = (String)this.nodeService.getProperty(item, ContentModel.PROP_NAME);
logger.info(" - " + itemName);
}
}
this.nodeArchiveService.purgeArchivedNodes(deletedItemsToPurge);
tx.commit();
}
catch (Throwable err) {
if (logger.isWarnEnabled())
logger.warn("Error while cleaning the trashcan : " + err.getMessage());
try {
if (tx != null) {
tx.rollback();
}
}
catch (Exception tex) {
if (logger.isWarnEnabled())
logger.warn("Error while during the rollback : " + tex.getMessage());
}
}
finally {
if (results != null) {
results.close();
}
}
}
}
为了弄清楚lucene使用的存档日期,我做了几个测试:
我在 2015/03/27 18:26 通过文档库根目录中的共享 UI 创建了一个文件 TestFile.txt,然后在 2015/03/27 [=46] 将其移动到垃圾桶=].
然后我尝试使用 lucene 查询通过 http://localhost:8080/alfresco/s/enterprise/admin/admin-nodebrowser 检索该文件:archive://SpacesStore
中的 @{http://www.alfresco.org/model/system/1.0}archivedDate:[1970-01-01T00:00:00.000Z TO 2015-03-26T23:00:00.000Z]
。
我发现如果我将 toDate 更改为 2015-03-26T23:00:00.000Z
之前的任何时间戳,例如 2015-03-26T22:59:59.999Z
,则无法检索该文件。但是在 2015-03-26T23:00:00.000Z
之后或等于 2015-03-26T23:00:00.000Z
的任何时间戳都会成功检索到该文件。
那为什么是2015-03-26T23:00:00.000Z
而不是我实际删除的时间呢?关于内容节点存档日期的时间计算的任何想法?
我在 UTC-01 时区。方法 ISO8601DateFormat.format(new Date())
在此方法的实际调用时间前一小时返回时间戳。
这是为什么?
我不确定这是否真的是你的答案,但是关于 lucene 的范围查询不要太关注时间。
如果您只使用日期,它们就可以正常工作,但对于其他时间查询,它实际上不起作用。
但这应该没问题,您只需要用 java 进行额外检查,看看日期是否早于现在。
为什么作业没有在您设置的时间触发,我不确定,但这可能是一个 Alfresco 作业,因此您需要说明 XML 和 cronjob 值。
我正在 Tomcat7 上的 Alfresco one 5.0.0.3 运行 上测试 trashcanCleaner 模块。
问题出在清理动作的触发时间上。
清理动作的预设时间是每天04:00,保护天数设置为1。昨晚(2015/03/26)在18:10我上传了一些文件到存储库随后删除了大约 minites。根据配置,我刚刚删除的这些文件应该在垃圾桶中保留 1 天。但是今天(2015/03/27)早上10:00左右我发现那些文件已经被trashcanCleaner删除了,trashcanCleanerclass的日志如下:
2015-03-27 07:31:08,717 DEBUG [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] Trashcan cleaner query :
2015-03-27 07:31:09,139 DEBUG [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] @\{http\://www.alfresco.org/model/system/1.0\}archivedDate:[1970-01-01T00:00:00.000Z TO 2015-03-26T06:31:08.717Z]
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] Trashcan Cleaner is about to purge the following items :
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file1
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file2
2015-03-27 07:31:15,662 INFO [content.cleanup.TrashcanCleaner] [DefaultScheduler_Worker-4] - file3
从上面的日志来看,清洁器似乎是在 2015-03-27 07:31:08 触发的,这与 04:00 的预设不同,并且这些文件在垃圾桶中没有停留 1一天呢。 我对 lucene 搜索系统中设置的时间和 Alfresco 的存储库时间计算感到很困惑。
归档数据(删除时间)计算方法 下面是获取节点删除的主要代码:
public void execute() {
if (this.protectedDays > 0) {
Date fromDate = new Date(0L);
Date toDate = new Date(new Date().getTime() - 86400000L * Long.valueOf(this.protectedDays).longValue());
if (toDate == null) {
throw new RuntimeException("Error while building the query.");
}
String strFromDate = ISO8601DateFormat.format(fromDate);
String strToDate = ISO8601DateFormat.format(toDate);
StringBuilder buf = new StringBuilder(128);
buf.append("@").append(Repository.escapeQName(ContentModel.PROP_ARCHIVED_DATE))
.append(":").append("[").append(strFromDate)
.append(" TO ").append(strToDate).append("] ");
String query = buf.toString();
SearchParameters sp = new SearchParameters();
sp.setLanguage("lucene");
sp.setQuery(query);
NodeRef archiveRootRef = this.nodeArchiveService.getStoreArchiveNode(Repository.getStoreRef());
sp.addStore(archiveRootRef.getStoreRef());
if (logger.isDebugEnabled()) {
logger.debug("Trashcan cleaner query : ");
logger.debug(query);
}
UserTransaction tx = null;
ResultSet results = null;
try {
tx = this.transactionService.getNonPropagatingUserTransaction(false);
tx.begin();
results = this.searchService.query(sp);
List<NodeRef> deletedItemsToPurge = results.getNodeRefs();
if (logger.isInfoEnabled()) {
logger.info("Trashcan Cleaner is about to purge the following items :");
for (NodeRef item : deletedItemsToPurge) {
String itemName = (String)this.nodeService.getProperty(item, ContentModel.PROP_NAME);
logger.info(" - " + itemName);
}
}
this.nodeArchiveService.purgeArchivedNodes(deletedItemsToPurge);
tx.commit();
}
catch (Throwable err) {
if (logger.isWarnEnabled())
logger.warn("Error while cleaning the trashcan : " + err.getMessage());
try {
if (tx != null) {
tx.rollback();
}
}
catch (Exception tex) {
if (logger.isWarnEnabled())
logger.warn("Error while during the rollback : " + tex.getMessage());
}
}
finally {
if (results != null) {
results.close();
}
}
}
}
为了弄清楚lucene使用的存档日期,我做了几个测试: 我在 2015/03/27 18:26 通过文档库根目录中的共享 UI 创建了一个文件 TestFile.txt,然后在 2015/03/27 [=46] 将其移动到垃圾桶=].
然后我尝试使用 lucene 查询通过 http://localhost:8080/alfresco/s/enterprise/admin/admin-nodebrowser 检索该文件:archive://SpacesStore
中的 @{http://www.alfresco.org/model/system/1.0}archivedDate:[1970-01-01T00:00:00.000Z TO 2015-03-26T23:00:00.000Z]
。
我发现如果我将 toDate 更改为 2015-03-26T23:00:00.000Z
之前的任何时间戳,例如 2015-03-26T22:59:59.999Z
,则无法检索该文件。但是在 2015-03-26T23:00:00.000Z
之后或等于 2015-03-26T23:00:00.000Z
的任何时间戳都会成功检索到该文件。
那为什么是2015-03-26T23:00:00.000Z
而不是我实际删除的时间呢?关于内容节点存档日期的时间计算的任何想法?
我在 UTC-01 时区。方法 ISO8601DateFormat.format(new Date())
在此方法的实际调用时间前一小时返回时间戳。
这是为什么?
我不确定这是否真的是你的答案,但是关于 lucene 的范围查询不要太关注时间。
如果您只使用日期,它们就可以正常工作,但对于其他时间查询,它实际上不起作用。
但这应该没问题,您只需要用 java 进行额外检查,看看日期是否早于现在。
为什么作业没有在您设置的时间触发,我不确定,但这可能是一个 Alfresco 作业,因此您需要说明 XML 和 cronjob 值。