检测远程CMIS存储库更改的最有效方法?

时间:2012-08-30 05:08:51

标签: cmis

远程CMIS repository包含许多文件夹/文件。

我正在编写a software,以保持这些文件夹/文件的本地副本同步。

  1. 首次运行时,我只是递归下载所有内容。
  2. 在以后的运行中,我会检查已更改的内容,并下载所有更改。
  3. 检查远程更改的最有效方法是什么? (附加/删除文件/文件夹)
    效率最高=使用频率最低。

    我只能使用CMIS protocol,而且我无法在远程服务器上运行任何自定义软件。

    到目前为止我的想法:

    • 想法1:每次重新下载everthing。
    • 构思2:检查根文件夹的修改日期,希望修改日期是递归的。
    • 创意3:使用CMIS搜索查找比上次同步时更新的所有文件。问题:这不会告诉我哪些文件已被删除。

    还有其他想法吗? 我不太了解CMIS协议,可能会有更方便的东西。

2 个答案:

答案 0 :(得分:8)

使用存储库的更改日志是正确的方法,但要意识到并非每个存储库都支持这一点。例如,对于Alfresco,您必须配置审计子系统,并且必须在alfresco-global.properties中设置audit.cmischangelog.enabled = true。

要了解您的repo是否支持更改,您可以将其视为存储库的getCapabilities响应的结果。如果您将“更改”设置为“无”,那么您的存储库不支持更改日志。

假设确实如此,您需要向存储库询问其最新的更改日志令牌。你可以从getRepositoryInfo获得它。在调用getContentChanges之前保存它。然后,在下一次调用时,传入令牌。您将获得自令牌发布以来所做的更改。

因此,您的代码需要:

  1. 检查getCapabilities是否包含Changes = None
  2. 以外的内容
  3. 保存getRepositoryInfo的latestChangeLogToken
  4. 第一次询问时,调用没有参数的getContentChanges
  5. 下次询问时,请使用上次保存的令牌调用getcontentChanges
  6. 然后,您可以处理结果集。每个更改日志条目都会告诉您其类型(创建,更新,删除,权限等,请参阅规范的确切值),并提供已更改对象的cmis:objectId。
  7. 重复步骤2.
  8. 我有一个“cmis-sync”脚本,它使用Python实现的这种方法进行单向同步。我已经针对Alfresco作为源和OpenCMIS InMemory存储库作为目标进行了测试。如果有兴趣,我可以提供它。

答案 1 :(得分:2)

根据您发布的CMIS协议,可以轻松完成构思3的更理想版本。

  

2.1.11 Change Log

     

CMIS提供了一种“更改日志”机制,允许应用程序轻松发现自上一个时间点以来存储在存储库中的对象所发生的一组更改。然后,此更改日志可以由维护存储库的外部索引的搜索服务等应用程序使用,以有效地确定如何将其索引与存储库的当前状态同步(而不必查询存储库中当前的所有对象)

     

更改日志中记录的条目在下面称为“更改事件”。

     

请注意,更改日志中的更改事件必须从更改事件发生时起按升序返回。

使用您选择的任何工具,您应该能够初始拉动整个存储库并节省拉动执行的时间。对存储库的后续查询(按照您选择的间隔)使用以下过程完成:

  • 从存储库中下载CMIS更改日志
  • 解析上一次拉动后创建的所有更改
  • 根据ChangeType枚举执行操作:例如,如果objectID存在“已删除”枚举,则在本地删除该对象。