4

リモートCMIS リポジトリには、多くのフォルダー/ファイルが含まれています。

これらのフォルダー/ファイルのローカル コピーを同期するソフトウェアを作成しています。

  1. 最初の実行では、すべてを再帰的にダウンロードします。
  2. その後の実行では、何が変更されたかを確認し、変更があればダウンロードします。

リモートの変更を確認する最も効率的な方法は何ですか?
(ファイル/フォルダーの追加/削除)
最も効率的 = 帯域幅の使用量が最小。

CMIS プロトコルしか使用できず、リモート サーバーでカスタム ソフトウェアを実行できません。

これまでの私の考え:

  • アイデア 1: 毎回すべてを再ダウンロードする。
  • アイデア 2: 変更日が再帰的であることを期待して、ルート フォルダーの変更日を確認します。
  • アイデア 3: CMIS 検索を使用して、最後に同期したときより新しいすべてのファイルを検索します。問題: どのファイルが削除されたかわかりません。

他のアイデアはありますか?
CMIS プロトコルはよくわかりませんが、もっと便利なものがあるかもしれません。

4

2 に答える 2

8

リポジトリの変更ログを使用するのが正しい方法ですが、すべてのリポジトリがこれをサポートしているわけではないことに注意してください。たとえば、Alfresco の場合、監査サブシステムを構成する必要があり、alfresco-global.properties で audit.cmischangelog.enabled=true を設定する必要があります。

リポジトリが変更をサポートしているかどうかを確認するには、リポジトリの getCapabilities レスポンスの結果を確認できます。「変更」が「なし」に設定されている場合、リポジトリは変更ログをサポートしていません。

そうであると仮定すると、リポジトリに最新の変更ログ トークンを要求する必要があります。getRepositoryInfo から取得できます。getContentChanges を呼び出す前に保存してください。次に、次の呼び出しで、トークンを渡します。トークンが発行されてから行われた変更を取得します。

したがって、コードは次のようにする必要があります。

  1. Changes = None 以外の getCapabilities を確認してください
  2. getRepositoryInfo の latestChangeLogToken を保存します
  3. 初めて質問するときは、引数なしで getContentChanges を呼び出します
  4. 次に尋ねるときは、最後に保存したトークンを使用して getcontentChanges を呼び出します
  5. その後、結果セットを処理できます。各変更ログ エントリは、そのタイプ (作成、更新、削除、権限など、正確な値については仕様を参照) を示し、変更されたオブジェクトの cmis:objectId を提供します。
  6. 手順 2 から繰り返します。

Python で実装されたこのアプローチを使用して一方向の同期を行う「cmis-sync」スクリプトがあります。Alfresco をソースとして、OpenCMIS InMemory リポジトリをターゲットとしてテストしました。興味があれば、ご用意できます。

于 2012-08-30T20:19:10.863 に答える
2

アイデア 3 のより理想的なバージョンは、投稿した CMIS プロトコルを掘り下げることで簡単に実現できます。

2.1.11 変更ログ

CMIS は「変更ログ」メカニズムを提供し、アプリケーションが以前の時点以降にリポジトリに格納されたオブジェクトに発生した一連の変更を簡単に検出できるようにします。この変更ログは、リポジトリの外部インデックスを維持する検索サービスなどのアプリケーションで使用され、リポジトリの現在の状態にインデックスを同期する方法を効率的に決定できます (現在リポジトリにあるすべてのオブジェクトを照会する必要はありません)。 .

以下、変更ログに記録されるエントリを「変更イベント」と呼びます。

変更ログの変更イベントは、変更イベントが発生した時点から昇順で返されなければならないことに注意してください。

任意のツールを使用して、リポジトリ全体の最初のプルを実行し、プルを実行する時間を節約できるはずです。リポジトリへの後続のクエリ (選択した間隔で) は、次の手順で実行されます。

  • リポジトリから CMIS 変更ログを取得します
  • 以前のプル後に作成されたすべての変更を解析します
  • ChangeType 列挙に基づいて操作を実行します。たとえば、objectID に「deleted」列挙が存在する場合、そのオブジェクトをローカルで削除します。
于 2012-08-30T05:25:52.090 に答える