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

Nic*_*oul 4 cmis

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

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

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

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

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

我的想法到目前为止:

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

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

Jef*_*tts 8

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

要确定您的repo是否支持更改,您可以将其视为存储库的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存储库作为目标进行了测试.如果有兴趣,我可以提供.