-1

在我的 Lotus Notes 应用程序中,当用户单击一个操作时,该操作将调用一个运行在服务器上的代理,该代理将处理当前文档。调用的代理有时不会运行(我认为这是因为服务器的并发代理限制)。这就是为什么每 5 分钟会有一个维护代理运行到已处理的文档,而这些文档未被调用的代理处理。问题是,有时,这两个代理同时处理一个文档,产生不可接受的结果。

有没有一种方法可以模拟文档锁定,使得文档一次只能由一个代理处理?我不喜欢使用本机文档锁定,因为可能会出现业务规则问题。我尝试在其中一个代理处理文档时标记文档,然后在完成后清除标志。但是这里的问题是代理仍然有机会同时获取文档引用(可能是由于保存文档的延迟)。

请帮我。谢谢!:D

4

1 回答 1

1

是的,这并不难。创建一个锁定数据库,您可以在其中锁定文档。它们实际上只需要包含被锁定文档的 UNID。

当您的代理开始处理文档时,请检查是否存在锁定文档。如果没有,请创建一个。如果有,请暂时等待或跳过该文档。文档处理完成后,删除锁定文档。

这是微不足道的。当我们还在使用 Notes/Domino 5 时,我什至编写了一个简单的类来处理我的一个应用程序中的文档锁定。下面的代码引用了另一个脚本库中的一些函数和变量,但你明白了。我相信您可以轻松地修改代码以适合您。

Option Public
Option Declare
Use "Functions.Globals"


Class DocumentLock
    Private lockdb As NotesDatabase
    Private lockview As NotesView
    Private lockdoc As NotesDocument
    Private lockservername As String
    Private lockdbname As String
    Private lnpdoc As NotesDocument ' Document to lock/unlock

    Public Sub New(doc As NotesDocument)
        me.lockservername = globals.GetValue("LockServer")
        me.lockdbname = AppHomeDir + globals.GetValue("LockDBname")
        If me.lockdb Is Nothing Then
            Set me.lockdb = New NotesDatabase(me.lockservername, me.lockdbname)
        End If
        Set me.lockview = me.lockdb.GetView("LockedDocs")
        Call me.lockview.Refresh()
        Set me.lnpdoc = doc
    End Sub

    Public Sub LockMe()
        Set me.lockdoc = New NotesDocument(me.lockdb)       
        me.lockdoc.Form="Locked"
        me.lockdoc.LockUNID=me.lnpdoc.UniversalID
        me.lockdoc.LockUser= globalcurrentusername 
        me.lockdoc.LockTime=Str(Now())
        me.lockdoc.ClaimNumber = me.lnpdoc.GetItemValue("ClaimNumber")(0)
        me.lockdoc.DocumentForm = me.lnpdoc.GetItemValue("Form")(0)
        Call me.lockdoc.Save(True,True)
    End Sub

    Public Sub UnlockMe()
        Call me.lockview.Refresh()
        Set me.lockdoc = me.lockview.GetDocumentByKey(me.lnpdoc.UniversalID)
        If Not me.lockdoc Is Nothing Then
            Call me.lockdoc.Remove(True)
            Call me.lockview.Refresh()
        End If
    End Sub

    Public Function IsLocked(flagShowInfo As Boolean) As Boolean
        Call lockview.Refresh()
        Set me.lockdoc = me.lockview.GetDocumentByKey(me.lnpdoc.UniversalID)
        If me.lockdoc Is Nothing Then
            me.IsLocked = False
        Else
            me.IsLocked = True
            If flagShowInfo = True Then
                MsgBox "Document locked " & locktext & "." & Chr$(13) & "Please wait a while and try again.."
            End If
        End If
    End Function

    Public Function LockText() As String
        LockText = "by " & LockUserName() & " at " & me.lockdoc.LockTime(0) 
    End Function

    Public Function LockUserName() As String
        Dim lockedby As String
        lockedby = me.lockdoc.LockUser(0)
        If lockedby = globalcurrentusername Then
            LockUserName = "you"
        Else
            LockUserName = lockedby
        End If
    End Function

End Class
于 2012-11-08T15:50:32.250 回答