3

xPages でドキュメントのロックに対処する最善の方法は何ですか? 現在、標準のソフト ロックを使用していますが、ノーツ クライアントではかなりうまく機能しているようです。

xPages では、「ドキュメントのロックを許可する」機能を使用することを検討しましたが、人々が閉じるボタンや保存ボタンを使用せずにブラウザーを閉じると、ロックが解除されないのではないかと心配しています。

ユーザーがセッションを閉じたときにロックをクリアする方法はありますか? そのようなイベントは見られません。

または、ドキュメントをロックする簡単な方法はありますか?

エージェントを使用してロックをクリアできることはわかっていますが、いつ実行するのですか? ある夜、ロックが実際にアクティブではなくなったとかなり確信しています。

4

5 に答える 5

1

私が使用しているコードは次のとおりです。

/* DOCUMENT LOCKING */
/*

    use the global object "documentLocking" with:
    .lock(doc) -> locks a document
    .unlock(doc) -> unlocks a document
    .isLocked(doc) -> returns true/false
    .lockedBy(doc) -> returns name of lock holder
    .lockedDT(doc) -> returns datetime stamp of lock

*/ 
function ynDocumentLocking() {

    /*

        a lock is an entry in the application scope

        with key = "$ynlock_"+UNID

        containing an array with
        (0) = username of lock holder
        (1) = timestamp of lock


    */

    var lockMaxAge = 60 * 120; // in seconds, default 120 min

    this.getUNID = function(v) {
        if (!v) return null;
        if (typeof v == "NotesXspDocument") return v.getDocument().getUniversalID();
        if (typeof v == "string") return v;
        return v.getUniversalID();
    }

    /* puts a lock into application scope */
    this.lock = function(doc:NotesDocument) {
        var a = new Array(1);
        a[0] = @UserName();
        a[1] = @Now();
        applicationScope.put("$ynlock_"+this.getUNID(doc), a);  
        // print("SET LOCK "+"$ynlock_"+doc.getUniversalID()+" / "+a[0]+" / "+a[1]);
    }   

    /* removes a lock from the application scope */
    this.unlock = function(doc:NotesDocument) {
        applicationScope.put("$ynlock_"+this.getUNID(doc), null);
        //print("REMOVED LOCK for "+"$ynlock_"+doc.getUniversalID());
    }

    this.isLocked = function(doc:NotesDocument) {
        try {
            //print("ISLOCKED for "+"$ynlock_"+doc.getUniversalID());       

            // check how old the lock is
            var v = applicationScope.get("$ynlock_"+this.getUNID(doc));
            if (!v) {
                //print("no lock found -> return false");
                return false;   
            }

            // if lock holder is the current user, treat as not locked
            if (v[0] == @UserName()) {
                //print("lock holder = user -> not locked");
                return false;
            }


            var dLock:NotesDateTime = session.createDateTime(v[1]);
            var dNow:NotesDateTime = session.createDateTime(@Now());
            // diff is in seconds
            //print("time diff="+dNow.timeDifference(dLock)+" dLock="+v[1]+" now="+@Now());
            // if diff > x seconds then remove lock, it not locked
            if (dNow.timeDifference(dLock) > lockMaxAge) {
                // print("LOCK is older than maxAge "+lockMaxAge+" -> returning false");
                return false;
            }
            //print("return true");
            return true;
        // TODO: check how old the lock is
        } catch (e) {
            print("ynDocumentLocking.isLocked: "+e);
        }

    }

    this.lockedBy = function(doc:NotesDocument) {
        try {
        var v = applicationScope.get("$ynlock_"+this.getUNID(doc));
        if (!v) return "";
        //print("ISLOCKEDBY "+"$ynlock_"+doc.getUniversalID()+" = "+v[0]);
        return v[0];

        } catch (e) {
            print("ynDocumentLocking.isLockedBy: "+e);
        }
    }

    this.lockedDT = function(doc:NotesDocument) {
        try {
        var v = applicationScope.get("$ynlock_"+this.getUNID(doc));
        if (!v) return "";
        return v[1];

        } catch (e) {
            print("ynDocumentLocking.isLockedBy: "+e);
        }
    }

}

var documentLocking = new ynDocumentLocking();
于 2013-10-28T18:42:30.563 に答える
0

ApplicationScopeは、「ロックされた」ドキュメントをキャプチャするのに適した場所です。結局のところ、applicationScopeを期限切れにするには、すべてのユーザーのセッションが期限切れになっている必要があるため、ページを開いているユーザーはとにかく保存できません。

たぶん、誰かがドキュメントを編集するときのUNID、ユーザー、および時間をキャプチャします。ドキュメントを保存するときに値をクリアします。ユーザーがブラウザなどを閉じる可能性があることに注意してください。私はこのアプローチについて社内で話し合っており、最終的にこれを構築する場合は、OpenNTFに追加することを検討します。しかし、来月中にはそれに乗り込む可能性は低いです。

于 2012-06-12T22:44:57.497 に答える
0

webDAV の仕組みからページを取得できます。そこでは、サーブレットがロックされたドキュメントの「ロック リスト」を管理します。ロックは 10 分後に自動的に期限切れになります。ロックは、通話を通じて更新または終了できます。したがって、ドキュメントを編集するときは、ロックを要求し、8 分ごとに再ロック機能を呼び出す CSJS タイマーを開始し (エラーの余地があります)、postSave がロック解除を呼び出します (編集モードにとどまらない限り)。ユーザーが 10 分後にブラウザを閉じると、ドキュメントは自動的にロック解除されます。ロック機能を実装する方法は自由なので、ユーザー/場所をキャプチャし、その情報を「ロックに失敗しました」表示で使用できます (イベントをさらにプッシュして、元の作成者にそれを知らせるか、「再試行」オプションを実行することができます)。実装するのは簡単ではありません。

于 2012-06-04T15:09:19.777 に答える
0

Domino ロックインwindow.onunloadイベントを削除できます。

window.onunload = function(){
    dojo.xhrGet(...
}

車輪を再発明する必要はありません。

于 2013-10-28T18:11:41.857 に答える