連携ロック
連携ロックとは、複数の Content Engine API ベース・アプリケーションによるオブジェクトの同時更新を防ぐためのメカニズムです。 このメカニズムは、アプリケーションが自主的にオブジェクトをロックし、ロックを確認し、アンロックされるまでオブジェクトを変更せずロック状態を維持する、という意味で連携的です。 ある一定の権限を持つ任意のアプリケーションがロックの有無に関わらず、オブジェクトに対してアクションを実行できる点に注意してください。さらに、非連携的アプリケーションは、オブジェクトのロックの確認も維持もしません。 連携的ロックは、ロックされたオブジェクトに対するアプリケーションの変更や削除を抑止しません。連携ロックは、オブジェクトのロック、ロックのテスト、およびオブジェクトのロック状態に基づく実行アクションの決定のための自主的なメカニズムを提供します。
インターフェース (およびサブインターフェース) CustomObject、Document、および Folder のオブジェクトをロックできます。これらのインターフェースには、ロック、アンロック、ロックの延長、およびオブジェクトのロック状況の確認のためのメソッドがあります。また、スーパーインターフェース Containable には、ロック情報 (ロックの所有者や期間など) に関する読み取り可能なプロパティーがあります。
オブジェクトをロックまたはアンロックすると、Lock または Unlock の保留アクション インスタンスが作成されます。これらのアクションがサーバーにコミットされると、LockEvent または UnlockEvent がトリガーされます。これらのイベントは監査可能です。
連携ロックに関与するアプリケーションでは、ドキュメント、フォルダー、またはカスタム・オブジェクトを変更するときに次の操作が行われます。
ドキュメント、フォルダー、またはカスタム・オブジェクトを変更する前に、連携ロックに関与するアプリケーションは、最初にオブジェクトのロック状態を確認し、オブジェクトがロックされた場合は、ロックに関する情報を取得します。
サンプル・コードについては、「ロック可能オブジェクトの操作」を参照してください。
オブジェクトのロック
オブジェクトにロックを適用するには、オブジェクトの lock メソッドを呼び出します。lock メソッドの timeout パラメーターは、オブジェクトをロックする期間 (秒単位) です。有効期限の時刻は、オブジェクトの DateLastModified プロパティーの時刻値に、lock メソッドの timeout パラメーターの値を合計した値と同等です。その後ロック所有者がオブジェクトに対して更新アクティビティーを実行すると、DateLastModified の時刻が変更されます。これにより、ロックがリフレッシュされ、ロックのタイムアウト期間が延長されます。ロック所有者は、updateLock メソッドを明示的に呼び出してロックのタイムアウト期間を延長することもできます。ロックを延長する場合は、このメソッドを呼び出す方法をお勧めしますが、unlock メソッドを呼び出してから lock メソッドを呼び出す方法でも同様の結果が得られます。この場合、この 2 つの呼び出しの間に別のアプリケーションが割り込み、ロックを奪う可能性があります。
オブジェクトに対して lock または updateLock メソッドを呼び出した後には、サーバーでロック操作をコミットするため、オブジェクトを保存する必要があります。保存を正常に実行するには、少なくとも AccessRight.WRITE 権限が必要です。
CustomObject、Document、または Folder がロックされている間、ロックが取り除かれるかまたは期限が切れるまでは、その他の連携アプリケーションは、オブジェクトに読み取りアクセス権限が設定されたようにこのオブジェクトを取り扱う必要があります。
変更の適用
オブジェクトがロックされたら、ロック所有者はロックされたオブジェクトのコンテンツ、プロパティー、および権限を、通常の場合と同様に変更できます。実行できる変更の範囲は、ロック所有者の権限の有効範囲によって異なります。
オブジェクトのアンロック
オブジェクトのロックの所有者は、次のいずれかの方法でロックを解除できます。
- unlock メソッドを呼び出す。既存のロックを解除できるのはロック所有者のみです。
- ロックのタイムアウト値が満了するまで待機する。
ロックされていないオブジェクトをアンロックしようとすると、EngineRuntimeException が例外コード E_OBJECT_NOT_LOCKED でスローされます。
ロック状況の確認
連携ロックに関与するアプリケーションは、CustomObject、Document、または Folder オブジェクトを変更する前に、これらのオブジェクトのロック状況を判別する必要があります。 ロック状況を確認する目的で isLocked メソッドが用意されていますが、このメソッドは呼び出し時点での、大まかなロック状態を返す点に注意してください。このメソッドを実行し、値が返された直後に、別のアプリケーションが lock メソッドを呼び出してオブジェクトのロック状態が変更される可能性や、ロックの有効期限が切れる可能性があります。 したがって、状況確認方法としては、lock メソッドを呼び出し、メソッドが失敗した場合にスローされる例外を処理する方法をお勧めします。
オブジェクトがロックされた場合、アプリケーションは Containable インターフェースからロックに関する情報を取得できます。このインターフェースには、ロックに関連する次の読み取り専用プロパティーがあります。lock メソッド呼び出しが正常に完了すると、これらのプロパティーに値が設定され、オブジェクトのプロパティー・キャッシュに格納されます。
- LockOwner プロパティーは、オブジェクトの書き込みアクセス・ロックを排他的に所有するクライアントを示します。
- LockToken プロパティーには、ロックを表す文字列 (GUID) が含まれています。
- LockTimeout プロパティー値は、ロックの有効期限時刻の計算に使用されます。このプロパティーの値は最初に lock メソッドにより設定され、その後 updateLock 呼び出しによりリセットできます。このプロパティー値は、オブジェクトの DateLastModified プロパティーに指定した値より後に、ロック所有者がオブジェクトのロックを保持できる期間を秒数で示します。(DateLastModified プロパティーが設定されていない場合は、DateCreated プロパティー値が計算に使用されます。)計算の結果は、現在のシステム時刻を基準に測定されます。オブジェクトの DateLastModified プロパティー値と LockTimeout プロパティー値の合計が、現行のシステム時刻よりも前の時刻である場合は、ロックは有効期限切れと見なされます。