4

远程CMIS 存储库包含许多文件夹/文件。

我正在编写一个软件,使这些文件夹/文件的本地副本保持同步。

  1. 在第一次运行时,我只是递归下载所有内容。
  2. 在以后的运行中,我检查发生了什么变化,并下载任何变化。

检查远程更改的最有效方法是什么?
(额外/删除文件/文件夹)
最有效 = 最少带宽使用。

我只能使用CMIS 协议,不能在远程服务器上运行任何自定义软件。

到目前为止我的想法:

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

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

4

2 回答 2

8

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

要了解您的存储库是否支持更改,您可以查看存储库的 getCapabilities 响应的结果。如果您看到“更改”设置为“无”,则您的存储库不支持更改日志。

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

因此,您的代码需要:

  1. 检查 getCapabilities 除了 Changes = None
  2. 保存 getRepositoryInfo 的 latestChangeLogToken
  3. 第一次询问时,不带参数调用 getContentChanges
  4. 下次询问时,使用最后保存的令牌调用 getcontentChanges
  5. 然后,您可以处理结果集。每个更改日志条目都会告诉您其类型(创建、更新、删除、权限等,具体值参见规范)并提供更改对象的 cmis:objectId。
  6. 重复步骤 2。

我有一个“cmis-sync”脚本,它使用 Python 中实现的这种方法进行单向同步。我已经针对 Alfresco 作为源和 OpenCMIS InMemory 存储库作为目标对其进行了测试。如果有兴趣,我可以提供。

于 2012-08-30T20:19:10.863 回答
2

根据您发布的 CMIS 协议的一些挖掘,可以轻松完成想法 3 的更理想版本。

2.1.11 变更日志

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

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

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

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

  • 从存储库中拉下 CMIS 变更日志
  • 解析上次拉取后创建的所有更改
  • 根据 ChangeType 枚举执行操作:例如,如果 objectID 存在“deleted”枚举,则在本地删除该对象。
于 2012-08-30T05:25:52.090 回答