3

私は 2 つのエージェントを作成しました。1 つは Java で作成し、もう 1 つは Lotusscript で作成しました。java エージェントは 5 分ごとに実行されるようにスケジュールされていますが、lotusscript エージェントは 15 分ごとに実行されるようにスケジュールされています。したがって、それらが同時に実行される時が来るでしょう。その場合、java エージェントは、lotusscript エージェントが終了するまで一時停止/待機する必要があります。Profile DOcuments と Environment Variables を使用してロックをシミュレートしようとしましたが、役に立ちませんでした。この 2 つの異なるエージェント間のロックをシミュレートする方法はありますか? 助けてください。どうもありがとう!

編集:さらに複雑にするために、2つのエージェントが2つの異なるデータベースに存在することを忘れていました:(

4

4 に答える 4

6

5 分ごとに定期的に実行され、他の 2 つのエージェントを開始する 3 つ目のエージェント (おそらく追加のデータベース内) を作成しない理由は次のとおりです。

  1. 毎回 Lotus Script Agent
  2. 3 回ごとの Java エージェントの実行

...そして、複雑なロックメカニズムなしで、実行順序も制御できます。

于 2011-09-07T15:55:53.517 に答える
4

これは、独立したエージェントの実行順序を制御するために機能する、ほぼ確実な方法です。実際のメモ ドキュメントを疑似ロック ドキュメントとして使用します。

以前にこれを行った方法は、「ロック」を表す Notes ドキュメントを保持することです。複製/保存の競合の問題が発生しやすく、ビューで表示できないため、データベース プロファイル ドキュメントは使用しないでください。

「ロック」ドキュメントには、現在実行が許可されているかどうかを Java エージェントに通知するフラグを設定できます。Java エージェントには、次のようなコードが含まれているだけです。

Session s = NotesFactory.createSession();
Database db = s.getDatabase("This Server", "This database");
View vw = db.getView("(lockView)");
Document docControl = vw.getFirstDocument();
String sRunStatus = docControl.getItemValueString("runStatus");
boolean bContinue = false;
if (sRunStatus =="Go"){
    bContinue = true;
}
if(bContinue){
    //do agent code here....

    // reset the status to "wait". The lotusscript agent should then set it to "Go"
    // the other agent will execute on "wait" and then update the status to "Go" on 
    // completion to prevent simulatenous execution. Can also use different state names
    // instead of go/wait, like run0, run1, run2 etc
    docControl.replaceItemValue("runStatus", "wait");
    docControl.save(true);
}

エージェントを使用して、コントロール ドキュメントの「runStatus」フィールドに「Go」/「wait」値を設定することに注意してください。必要なドキュメントは 1 つだけなので、ビューから最初のドキュメントを取得するだけで済みます。

同等のロジックをさらに簡単に LotusScript エージェントに追加する必要があります。私が見つけた唯一の欠点は、コントロール ドキュメントがまだ "go" に設定されておらず、ロジックを実行せずに "IF" テストが失敗したため、Java エージェントがコードを実行しない可能性があることです。 Java エージェントが lotusscript エージェントを使用して目的の順序で実行されないようにします。ただし、LotusScript エージェントがインスタンスを解放した場合は、次にスケジュールされたインスタンスで起動します。

このアイデアを拡張して、「RunAgent1」、「RunAgent2」などの特定の値を使用して、エージェントのスイートを管理したり、複数のエージェントをチェーンしたりすることもできます。別の利点は、実行開始時間、エラーなどもキャプチャできることです。あなたが必要とする....

于 2011-09-07T07:20:51.517 に答える
1

データベースでドキュメントのロックを有効にするとうまくいく可能性があります。データベース自体でドキュメントのロックを有効にできる場合、エージェントに特定のドキュメントをロックさせ、コードを実行する前/実行中にドキュメントがロックされているかどうかを確認できます。

そのデータベースでドキュメントのロックを有効にすることができない場合は、別のデータベースを作成してドキュメントを保存することを検討できます。

これらのエージェントを同時に実行できないのはなぜですか? エージェントを同時に実行できるようにしながら、同じ結果を達成できる可能性があります。このようにエージェントを制御しようとすると、通常、別の問題が発生します。データベースにレプリカがある場合、ソリューションが壊れる可能性があります。

于 2011-09-07T07:09:35.283 に答える
0

2 つのデータベースだとおっしゃいましたが、エージェントの同時実行を停止する最も簡単な方法は、それらを同じデータベースに配置することです。エージェントとエージェントによって生成されたログ ドキュメントのみを含む特別なデータベースを頻繁に作成します。エージェントは任意のデータベースを開くことができるため、エージェントがどこにあるかは問題ではありません。

私はかつて、ジュリオとスプーキーコーダーのアイデアを組み合わせた、エージェント用の独自の制御メカニズムを構築したプロジェクトを率いていました。1 つの「マスター」エージェントのみがスケジュールされ、コントロール ドキュメントを読み取って、次に実行するエージェントを決定しました。エージェント A、B、および C がいるとします。マスターは A を実行します。マスターは A を実行し、これはすぐにコントロール ドキュメントを更新して「私は実行中です」と表示し、進行状況情報でフィールドを更新し、最後に完了時にそれを更新します。コントロール ドキュメントを「B」のいずれかで更新します。マスターが次に実行されるときに、コントロール ドキュメントを調べます。進捗情報が A が終了したことを示している場合、マスターは B が実行する番であることがわかります。もちろん、A は B がする仕事がないことに気付くかもしれないので、代わりに「C」と書いたかもしれませんが、

于 2011-09-21T21:09:53.157 に答える