露天垃圾桶清理器作业未在预设时间触发



我正在Tomcat7上运行的Alfresco上的5.0.0.3上测试垃圾桶清理器模块。

问题在于触发清理操作的时间。

清理操作的预设时间为每天 04:00,受保护天数设置为 1。昨晚(2015/03/26(18:10,我将某些文件上传到存储库,然后删除了它们。根据配置,我刚刚删除的这些文件应该在垃圾桶中停留 1 天。但是今天(2015/03/27(早上10:00左右,我发现这些文件已经被垃圾桶清理器删除了,垃圾桶清理器类的日志如下:

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 使用的存档日期,我进行了 sevral 测试:我在 2015/03/27 18:26 通过文档库根目录中的共享 UI 创建了一个文件 TestFile.txt然后在 2015/03/27 18:29 将其移动到垃圾桶。

然后我尝试使用 lucene 查询通过 http://localhost:8080/alfresco/s/enterprise/admin/admin-nodebrowser 检索该文件:@{http://www.alfresco.org/model/system/1.0}archivedDate:[1970-01-01T00:00:00.000Z TO 2015-03-26T23:00:00.000Z] in archive://SpacesStore .我发现如果我将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而不是我实际删除它的时间呢?关于内容节点存档日期的时间计算有什么想法吗?

我所在的时区是UTC-01。该方法ISO8601DateFormat.format(new Date())在此方法的实际调用时间前一小时重新设置时间戳。

这是为什么呢?

我不确定这是否真的是你的答案,但不要过多地关注 lucene 的范围查询时间。

如果您只使用日期,它们工作正常,但对于时间查询的其余部分,它们并不真正起作用。

但这应该没问题,你只需要用java做一个额外的检查,看看日期是否在现在之前。

以及为什么作业在您设置它的时间没有触发,我不确定,但它可能是一个露天作业,所以你需要声明XML和cronjob值。

相关内容

  • 没有找到相关文章

最新更新