1

OpenNTF に投稿された例を見てきました - http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Threads%20and%20Jobs私の問題は、参照できないようです初期スレッドを作成するメインクラスの外部にある別のクラスに。

デモ コードに基づいて使用しようとしているコードを次に示します (これは正常に動作します)。内部クラス内から、この場合は外部クラスから Broadcast クラスを呼び出そうとするなど、さまざまなバリエーションを試しました。すべてのケースで ClassNotFoundException が発生します - 注意: Broadcast クラスはこの ThreadSample と同じパッケージに含まれています。

public class ThreadSample {

private MyThread myThread;

public  boolean isRunning() {
    return myThread != null;
}

public  void startThread()
throws NotesException {
    if (myThread != null) {
        stopThread();
    }

    try {
        {
            if (myThread == null) {
                myThread = new MyThread();
                myThread.start();
            }
            System.out.println("Thread started");
        }
    } catch (Throwable t) {
        t.printStackTrace();
    }
}

public  void stopThread() {
    if (myThread != null) {
        synchronized (ThreadSample.class) {
            if (myThread != null) {
                myThread.stopRequest = true;
                myThread = null;
                System.out.println("   >> Thread stopping");
            }
        }
    }
}
public void test(){
    System.out.println("HERE in Test");
    Broadcast.test_subscribe();
}

class MyThread extends Thread {
    boolean stopRequest;
    private ThreadSessionExecutor<IStatus> executor;

    MyThread() throws NotesException {

        this.executor = new ThreadSessionExecutor<IStatus>() {
            @Override
            protected IStatus run(Session session) throws NotesException {
                try {
                    System.out.println("   >> Thread running here");
                    ThreadSample.this.test_subscribe();
                    System.out.println("   >> After test call");
                } catch (Throwable ex) {
                    ex.printStackTrace();
                }
                return Status.OK_STATUS;
            }
        };
    }

    public void run() {
        while (!stopRequest) {
            try {
                executor.run();
            } catch (Exception ex) {
            }
        }
        System.out.println("Thread left");
    }
}
}
4

2 に答える 2

1

スレッドでセッション アクセスが必要な場合は、SessionCloner を使用できます。独自のクラスローダーをロードしないため、プラグインとして展開する必要はありません。サーバー上の java.policy ファイルを変更する必要があるかもしれません (これをテストする前に java.policy を変更したので、よくわかりません)。

これらのインポートが必要です:

com.ibm.domino.xsp.module.nsf.NSFComponentModule をインポートします。

com.ibm.domino.xsp.module.nsf.NotesContext をインポートします。

com.ibm.domino.xsp.module.nsf.SessionCloner をインポートします。

クラスには 2 つのフィールドが必要です

プライベート SessionCloner sessionCloner;

プライベート NSFComponentModule モジュール。

コンストラクターで:

// 現在のセッションを渡すために必要なオブジェクトを初期化します

this.module = NotesContext.getCurrent().getModule();

this.sessionCloner = SessionCloner.getSessionCloner();

run メソッドで (匿名の ThreadSessionExecutor クラスの run メソッドから Thread クラスの run メソッドにコードを移動します):

セッション セッション = null;

試す {

NotesContext context = new NotesContext( this.module );

NotesContext.initThread( コンテキスト );

セッション = this.sessionCloner.getSession();

// あなたのコード

} catch (スロー可能な例外) {

// エラー ログ、スタック トレースの出力など

} 最後に {

NotesContext.termThread();

試す {

  this.sessionCloner.recycle();

} catch (NotesException 例外) {}

}

于 2012-06-28T05:46:13.813 に答える
1

ジョブが NSF にある場合、セキュリティ上の理由から一部のコア Eclipse クラスにアクセスできません。これは、たとえば IStatus の場合です。一方、クラスをプラグインの一部としてデプロイすると、コア Eclipse ランタイムに依存する可能性があります。ThreadSessionExecutor のコンテキスト クラスローダーにも既知の問題があり、N/D の次のリリースで修正されています。8.5.3 では、ジョブをプラグインとしてデプロイすることをお勧めします。

于 2012-06-27T14:54:19.830 に答える