0

サーバー タスク アドインをプログラミングしていて、クリーンで再利用可能なコードを作成しようとしています。データベースのセットをループしてから、データベース内のいくつかのドキュメントをループしています。

    for (String serverAndFilename : listofServerFilenames) {
        String[] parts = serverAndFilename.split("!!");
        currentGECDB = session.getDatabase(parts[0], parts[1]);
        if (currentGECDB.isOpen()) {
        collSourceDocuments = currentGECDB.search(this
            .getSearchFormula(this
                .getvariablePartOfSearchFormula()));
        countOfSearchDocuments = collSourceDocuments.getCount();    
            docToChange = collSourceDocuments
                .getFirstDocument();
            while (docToChange != null) {
            if (changeNamesFieldsOnThisDocument(docToChange)) {
//                .... other code here
            } 
            tmpdoc = collSourceDocuments.getNextDocument();
            docToChange.recycle();
            docToChange = tmpdoc;
            }
        }
        }
    }

Java 関数のパラメータとして大量の Notes オブジェクトを使用する場合のメモリ管理の問題が心配です。関数が行う変更を確認しているときに、「古い」値を取得しているため、ドキュメントを再取得する前にドキュメントで recycle() を作成する必要があります。

外部関数への引数としてプリミティブのみを渡すことを余儀なくされているように私には思えます。

public booleanfunction (String ServerName, String ReplicaIDOfDatabase, String UNIDofDocument)

しかし、これは、後続の OpenDatabase 呼び出しが多く発生することを意味し、コストが高くなります。

これを行う最善の方法はありますか?

例として、これは結果に対して作成している JUnit テストの一部です。

public void testNewArrivalTaskExample() {
try {
    testNewArrivalTask = GECTaskNewArrival.getTestTask(db, oli);
    testNewArrivalTask.save();

    Document testdocNewArrival_1 = getNewTestSourceCourrierDocument();
    for (NamesItemsInProcedure n : NamesItemsInProcedure.values()) {
    setNamesField(testdocNewArrival_1, n,
        GECTaskNewArrival.NEW_ARRIVAL_ROLE_MODEL,
        NamesItemsInProcedure.NOUVELLE_ARRIVEE);
    }

    testdocNewArrival_1.replaceItemValue("TestDocumentDescription",
        "NewArrival_AllFields");
    testdocNewArrival_1.save();

    GECTaskNewArrival gna = new GECTaskNewArrival(testNewArrivalTask,
        db, oli);

    gna.process();

    Item itemsuivi = testdocNewArrival_1
        .getFirstItem(NamesItemsInProcedure.SUIVI_COURRIER
            .getItemName());

    System.out.println("Content of document without recycle + rebirth:");
    printItemValuesToSysout(itemsuivi);

    System.out.println(NamesItemsInProcedure.SUIVI_COURRIER
        .getItemName()
        + " Should contain "
        + GECTaskNewArrival.NEW_ARRIVAL_NEWPERSON);

    String noteID = testdocNewArrival_1.getNoteID();
    testdocNewArrival_1.recycle();

    for (NamesItemsInProcedure n : NamesItemsInProcedure.values()) {
    boolean result = itemContainsThisForTestDoc(GECAlladin, noteID,
        n.getItemName(),
        GECTaskNewArrival.NEW_ARRIVAL_NEWPERSON);
    switch (n) {
    case ENCOURS_COURRIER:
        assertTrue(result);
        break;
    case AUTEURS_COURRIER:
        assertTrue(result);
        break;
    case SUIVI_COURRIER:
        assertTrue(result);
        break;
    case ECHEANCEMESSAGENOM_COURRIER:
        assertTrue(result);
        break;
    default:
        // assertFalse(result);
        break;

    }
    }

} catch (NotesException e) {
    e.printStackTrace();
}
}

これはコンソールの結果です:

Content of document without recycle + rebirth:

Suivi has these values:
Donald VieuxDeLaVieille/dsic/ville-ge`
the item belongs to this document 929E`
Suivi Should contain CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`

Suivi has these values:`
Donald VieuxDeLaVieille/dsic/ville-ge`
CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`
the item belongs to this document 929E`
Suivi contains CN=Micky NouvelleArrivee/OU=salut/OU=Truc/O=Muche`

私はまだ困惑しています。

4

1 に答える 1

1

次からコードを変更してみてください。

tmpdoc = collSourceDocuments.getNextDocument();

これに:

tmpdoc = collSourceDocuments.getNextDocument(docToChange);

ドキュメントによると、 getNextDocument 呼び出しから Document 引数を省略しても機能するはずですが、コレクションの構築方法に応じて DocumentCollection の内部にさまざまな実装があることを理解しています。 Document 引数を省略すると、 Database.search() によって作成された DocumentCollection の場合、いくつかの奇妙な結果 (つまり、表示されている「古い」値を説明する) があります。

于 2013-05-30T16:27:27.330 に答える