-1

私のLotusNotesアプリケーションでは、ユーザーがアクションをクリックすると、そのアクションは現在のドキュメントを処理するサーバー上エージェントを呼び出します。呼び出されたエージェントが実行されない場合があります(サーバーの同時エージェント制限のためだと思います)。これが、5分ごとに、呼び出されたエージェントによって処理されていない処理済みドキュメントに対して実行されるメンテナンスエージェントが存在する理由です。問題は、ドキュメントがこれら2つのエージェントによって同時に処理され、許容できない結果が生じる場合があることです。

ドキュメントを一度に1人のエージェントだけが処理できるように、ドキュメントのロックをエミュレートする方法はありますか?ビジネスルールに問題が発生する可能性があるため、ネイティブドキュメントロックを使用するのは好きではありません。エージェントの1人がドキュメントを処理するときにドキュメントにタグを付けてみましたが、処理が完了するとフラグがクリアされます。ただし、ここでの問題は、エージェントが同じ時間にドキュメント参照を取得する可能性がまだあることです(ドキュメントの保存が遅れる可能性があるため)。

私を助けてください。ありがとう!:D

4

1 に答える 1

1

ええ、それは難しいことではありません。ドキュメントをロックしているロッキング データベースを作成します。ロックされているドキュメントの UNID を含める必要があるだけです。

エージェントが文書の処理を開始したら、ロックしている文書が存在するかどうかを確認してください。そうでない場合は作成します。ある場合は、しばらく待つか、ドキュメントをスキップしてください。ドキュメントの処理が完了したら、ロックしているドキュメントを削除します。

これは些細なことです。まだ Notes/Domino 5 を使用していた頃、アプリケーションの 1 つで文書のロックを処理する単純なクラスを作成しました。以下のコードは、別のスクリプト ライブラリからいくつかの関数と変数を参照していますが、おわかりいただけたでしょうか。コードを簡単に変更して機能させることができると確信しています。

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 に答える