0

すべての 5 分間の xAgent に対して単一のエントリ ポイントを使用することを計画しています。つまり、1 つの XPage が 5 分間のすべての「Java エージェント」 (5 分ごとに起動する必要があるクラス) を起動します。そのようなエージェントを真に並行して起動するために、新しい異なるスレッドでそのJavaコードを起動したいと思います。

前述の「Java エージェント」は、他の NSF アプリケーション クラスと強い相互依存性を持っています。それらの多くは、FacesContext やその他の XSP / JSF グローバル変数に依存しています。

「Java エージェント」のコード例:

import javax.faces.context.FacesContext;
import com.ibm.domino.xsp.module.nsf.NSFComponentModule;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.ibm.xsp.extlib.util.ExtLibUtil;

public class Agent1 implements Runnable {

private NSFComponentModule module;

public Agent1() {
    this.module = NotesContext.getCurrent().getModule();
    System.out.println("Agent1: test 1.1: " + (ExtLibUtil.getCurrentSessionAsSigner() == null)); // FALSE here
    System.out.println("Agent1: test 1.2: " + (FacesContext.getCurrentInstance() == null)); // FALSE here
}

public void run() {
    NotesContext context = new NotesContext(this.module);
    NotesContext.initThread(context);

    System.out.println("Agent1: test 2.2: " + (ExtLibUtil.getCurrentSessionAsSigner() == null)); // TRUE here
    System.out.println("Agent1: test 2.2: " + (FacesContext.getCurrentInstance() == null)); // TRUE here

    // Threaded xAgent job here...

    NotesContext.termThread();
}
}

問題: FacesContext.getCurrentInstance()、ExtLibUtil.getCurrentSessionAsSigner() などのメソッドは、新しいスレッドで NULL を返します。

質問:新しいスレッド内で XSP / JSF エンジンを初期化して、FacesContext などにアクセスすることは可能ですか (「Agent1: test 2.1」および「Agent1: test 2.2」の行で null 以外を取得するため)?

前もって感謝します!

4

1 に答える 1

0

OpenNTF Domino API で XOTS を使用して開発しているときに、同様の問題に遭遇しました。最良のオプションは、コンストラクターで必要なオブジェクトを渡すことです。これは、XOTS http://www.intec.co.uk/xots-background-and-multithreaded-tasks-the-openntf-domino-api-way-part-two/に関する関連ブログ投稿です(「2」を「」に置き換えます)。シリーズの他の部分では「one」と「three」)。

XOTS は並列処理で非常にうまく機能し、デフォルトで 10 のスレッド数を構成できます。

XPages でのスレッド化に関するドキュメントを調べたところ、見つけたブログ投稿は、その投稿でカバーされていない潜在的な問題を示唆していましたが、詳しく説明していませんでした。詳しくは調べていません。

于 2015-06-23T10:43:08.633 に答える