3

(おそらく大きな)Lotus Dominoデータベース内のすべてのドキュメントを繰り返し処理し、処理が中断した場合(ネットワーク接続エラー、アプリケーションの再起動など)に最後のドキュメントから続行できるようにしたいと思います。データベースへの書き込みアクセス権がありません。

すでに処理されたドキュメントをサーバーからダウンロードする必要がない方法を探しています。したがって、(再起動された可能性のある)処理の最初のドキュメントとなる開始情報をサーバーに渡す必要があります。

  1. AllDocumentsプロパティとメソッドを確認しましたDocumentColletion.getNthDocumentが、このプロパティは並べ替えられていないため、2回の呼び出しで順序が変わる可能性があります。

  2. 別のアイデアは数式クエリを使用することでしたが、これらのクエリでは順序付けができないようです。

  3. 3番目のアイデアはDatabase.getModifiedDocuments、対応する方法を使用する方法でしたDocument.getLastModified。良さそうに見えましたが、返されたコレクションの順序は文書化されておらず、最終変更時間ではなく作成時間に基づいているように見えます。

    公式の例に基づくサンプルコードは次のとおりです。

    System.out.println("startDate: " + startDate);
    final DocumentCollection documentCollection = 
            database.getModifiedDocuments(startDate, Database.DBMOD_DOC_DATA);
    
    Document doc = documentCollection.getFirstDocument();
    while (doc != null) {
        System.out.println("#lastmod: " + doc.getLastModified() + 
                    " #created: " + doc.getCreated());
        doc = documentCollection.getNextDocument(doc);
    }
    

    次のように出力されます。

    startDate: 2012.07.03 08:51:11 CEDT
    #lastmod: 2012.07.03 08:51:11 CEDT #created: 2012.02.23 10:35:31 CET
    #lastmod: 2012.08.03 12:20:33 CEDT #created: 2012.06.01 16:26:35 CEDT
    #lastmod: 2012.07.03 09:20:53 CEDT #created: 2012.07.03 09:20:03 CEDT
    #lastmod: 2012.07.21 23:17:35 CEDT #created: 2012.07.03 09:24:44 CEDT
    #lastmod: 2012.07.03 10:10:53 CEDT #created: 2012.07.03 10:10:41 CEDT
    #lastmod: 2012.07.23 16:26:22 CEDT #created: 2012.07.23 16:26:22 CEDT
    

    (ここではデータベースにアクセスするために何も使用しませんAgentContext。データベースオブジェクトはsession.getDatabase(null, databaseName)呼び出しから取得されます。)

Lotus Domino Java APIを使用してこれを確実に行う方法はありますか?

4

4 に答える 4

4

データベースを変更するためのアクセス権がある場合、または誰かに変更を依頼できる場合は、一意のキーまたは変更された日付で並べ替えられたビューを作成し、最後に処理されたドキュメントへの「ポインタ」を保存する必要があります。

それを除けば、以前に処理されたドキュメントのリストを自分で管理する必要があります。その場合、AllDocumentsプロパティを使用して、それらを反復処理することができます。GetFirstDocumentとGetNextDocumentは、GetNthDocumentよりも高速であると報告されているため、使用してください。

または、2つのパスを作成します。1つは保存するすべてのドキュメントのUNIDのリストを収集し、2つ目のパスは所有しているUNIDのリストから各ドキュメントを処理します(GetDocumentByUNIDメソッドを使用)。

于 2012-10-22T22:39:50.280 に答える
3

私はJavaAPIを使用していませんが、Lotusscriptでは次のようにします。

データベース内のすべてのドキュメントを表示するビューを見つけます。エージェントを非常に高速にしたい場合は、新しいビューを作成します。最初の列は並べ替える必要があり、ドキュメントのユニバーサルIDを含めることができます。他の列には、エージェントで読み取りたいすべての値が含まれています。この例では、作成日と最終変更日です。

次に、コードは次のようにビューをループするだけです。

lastSuccessful = FunctionToReadValuesSomewhere() ' Returns 0 if empty
Set view = thisdb.GetView("MyLookupView")
Set col = view.AllEntries
Set entry = col.GetFirstEntry
cnt = 0
Do Until entry is Nothing
    cnt = cnt + 1
    If cnt > lastSuccessful Then
        universalID = entry.ColumnValues(0)
        createDate = entry.ColumnValues(1)
        lastmodifiedDate = entry.ColumnValues(2)
        Call YourFunctionToDoStuff(universalID, createDate, lastmodifiedDate)
        Call FunctionToStoreValuesSomeWhere(cnt, universalID)
    End If
    Set entry = col.GetFirstEntry    
Loop
Call FunctionToClearValuesSomeWhere()

最後に成功した値とユニバーサルIDを、たとえばテキストファイルや環境変数、さらにはプロファイルドキュメントにデータベースに保存するだけです。エージェントを再起動するときは、値が空白かどうかを確認するコードを用意してください(その後、0を返します)。そうでない場合は、最後に成功した値を返します。

于 2012-10-22T22:39:19.610 に答える
2

エージェントは、まだ処理されていないドキュメントを説明するフィールドをすでに保持しており、これらは通常の処理によって自動的に更新されます。

実行しようとしていることを実行するためのより良い方法は、検索結果をプロファイルドキュメントに保存することです。ただし、書き込み権限がないデータベース内のドキュメントに関連付けようとしている場合、実行できるのは、すでに処理したドキュメントリンクのリスト(およびそれらについて保持する必要のある情報)を保持することだけです。ドキュメント)、またはdoclinkごとに1つのドキュメントと、それらに対して行った処理に関連する複数のフィールドを保持する姉妹データベース。次に、IDのリストを転送し、クライアントで照合を実行して、ドキュメントごとのルックアップを実行します。

于 2013-07-18T04:20:20.787 に答える
1

Lotus Notes / Dominoデータベースは、複製された環境のクライアントとサーバーに分散されるように設計されています。一般的なケースでは、特定の作成時間またはmod時間に開始すると、一貫した結果が得られるという保証はありません。

ターゲットデータベースのレプリカが作成されていないことが100%確実な場合は、getModifiedDocumentsを使用してから、並べ替えルーチンを記述して、(modDateTime、UNID)ペアをSortedSetまたはその他の適切なデータ構造に配置できます。次に、Setを処理できます。エラーが発生した場合は、処理しようとした要素のmodDateTimeを再起動ポイントとして保存できます。ただし、まったく同じmodDateTimeスタンプを持つ複数のドキュメントがある場合は、重複を避けるためにいくつかの追加の詳細が必要になる場合があります。

最後に一言申し上げます。Javaについて質問されていることは承知していますが、コンプライアンスの目的でバックアップまたはアーカイブシステムで作業している場合、LotusCAPIには本当に注目すべき特別な機能があります。

于 2012-10-22T23:06:52.957 に答える