Вопрос по – Лучший способ справиться с блокировкой документов в xPages?

3

Как лучше всего бороться с блокировкой документов в xPages? В настоящее время мы используем стандартную мягкую блокировку, и она, кажется, работает довольно хорошо в клиенте Notes.

В xPages я рассмотрел возможность использования «Разрешить блокировку документов». особенность, но я беспокоюсь, что люди закроют браузер без использования кнопки закрытия или сохранения, тогда блокировка никогда не будет снята.

Есть ли способ снять блокировки, когда пользователь закрыл свой сеанс? Я не вижу такого события.

Или есть более простой способ блокировки документов?

Я понимаю, что могу снять блокировки с помощью агента, но когда его запустить? Я думаю, что когда-нибудь ночью я вполне уверен, что замок больше не должен быть активным.

Ваш Ответ

5   ответов
0

Я предпочитаю использовать решение, аналогичное Mr. Withers & apos; ответ. Основная проблема заключается в том, как бороться с нежелательной и страшной кнопкой назад. Документ легко заблокировать, когда он открыт, но есть много способов закрыть XPage, и пользователь не ограничивается только предоставленной вам навигацией, но также может, как он заявил, полностью закрыть браузер, использовать заднюю часть кнопка и т. д. Итак, лучший способ, который я могу придумать, - это создать несколько java-объектов, которые мы будем использовать в приложениях и сессиях.

Первым шагом является создание «LockedDocument». учебный класс. Как мы знаем, документы не сериализуемы, и мы не хотим сохранять сам документ в этом объекте, мы хотим сохранить UNID и время его сохранения. Мы хотим сделать это таким образом, чтобы мы смогли очистить объект через определенное время (например, от тридцати минут до часа). Этот класс должен также реализовать сопоставимый интерфейс, чтобы отсортировать коллекцию к этому времени так, чтобы самые старые документы были первыми, а самые новые - последними.

Затем мы создаем другой класс, который содержит список или карту с этими LockedDocuments. Этот класс также должен иметь поток (реализующий Runnable), который будет проверять все документы каждые пять минут или около того, я еще не проверял это, но он должен работать). Любой документ, заблокированный тридцать-шестьдесят минут назад (предопределенный), будет разблокирован (удален из списка). Важно, чтобы список был отсортирован, как описано выше, и чтобы цикл был «нарушен». когда достигается время меньше времени блокировки, чтобы предотвратить нежелательную обработку.

Следующим шагом будет включение пользовательского списка в sessionScope. Этот список является LockedDocuments, что этот текущий пользователь имеет. Он устанавливается, когда пользователь изменяет статус документа на редактируемый, и проверяется перед тем, как документ становится редактируемым, чтобы не допустить открытия одного документа на нескольких вкладках одним и тем же пользователем. Блокировка еще раз проверяется по запросу (). После открытия главной страницы блокировка автоматически снимается. Onquerysave () также должен проверить, чтобы убедиться, что UNID документов находится в списке sessionScope, или если документ новый, прежде чем разрешить сохранение.

quick recap
Любой UNID, сохраненный в applicationScope LockedDocumentList, не будет доступен для редактирования кем-либо, если он не существует в своем собственном списке sessionScope.
Можно предупредить пользователя о приближении их lockedTime и сбросить таймер.
Класс, содержащий список с заблокированными документами, должен быть одноэлементным
Вероятно, есть способы улучшить этот ответ, и я уверен, что что-то упустил. Это просто мысль.

Возможно, есть лучший способ справиться с этим, но это лучшее, что я нашел.

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="[email protected]());
            // 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();
0

Вы можете взять страницу, как работает webDAV. Там сервлет управляет «списком блокировок» заблокированных документов. Блокировки автоматически истекают через 10 минут. Замки могут быть возобновлены или прекращены через вызовы. Поэтому, когда вы редактируете документ, вы запрашиваете блокировку, а затем запускаете таймер CSJS, который вызывает функцию повторной блокировки каждые 8 минут (так что у вас есть запас на ошибку), а postSave вызывает разблокировку (если вы не остаетесь в режиме редактирования). Если пользователь закрывает браузер через 10 минут, документ автоматически разблокируется. Поскольку вы свободны в реализации функции блокировки, вы можете захватить пользователя / местоположение и использовать эту информацию в & quot; блокировка не удалась & quot; отображать (ваше событие может продвинуть это дальше и сообщить первоначальному автору об этом или сделать некоторую опцию «повторить»). Это не просто реализовать, но когда-то реализовано просто в использовании

Error: User Rate Limit Exceeded Bruce Stemplewski
Error: User Rate Limit Exceeded Bruce Stemplewski
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Bruce Stemplewski
0

Вы можете снять блокировку Domino вwindow.onunload событие:

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

Не нужно изобретать велосипед.

0

ApplicationScope может быть хорошим местом для захвата "заблокированных" документы. В конце концов, для истечения срока действия applicationScope все пользователи & apos; Сессии должны быть истекли, так что любой с открытой страницей не сможет сохранить в любом случае.

Возможно захватить UNID, пользователя и время, когда кто-то редактирует документ. Очистите значение при сохранении документа. Имейте в виду, что пользователь может закрыть браузер и т. Д. Я внутренне обсуждал этот подход, и если мы в конечном итоге создадим его, я бы хотел добавить его в OpenNTF. Но мы вряд ли доберемся до него в следующем месяце.

Похожие вопросы