我一直在查看在OpenNTF上发布的示例 - http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Threads%20and%20Jobs我的问题是我似乎无法引用另一个在创建初始Thread的主类之外的类。
继承我试图使用的代码,基于演示代码(工作正常BTW) - 我尝试了不同的变体,包括尝试从内部类中调用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");
}
}
}
答案 0 :(得分:1)
如果Job在NSF中,那么出于安全原因它无法访问某些核心eclipse类。例如,这就是IStatus的情况。另一方面,如果将类作为插件的一部分进行部署,那么它可以依赖于核心eclipse运行时。 ThreadSessionExecutor中的上下文类加载器也存在已知问题,并且已在下一版本的N / D中修复。 使用8.5.3,最好将作业部署为插件。
答案 1 :(得分:1)
如果您需要在线程中进行会话访问,则可以使用SessionCloner。然后您不需要将其部署为插件,因为它不会加载它自己的类加载器。您可能必须更改服务器上的java.policy文件(我在测试之前修改了java.policy,所以我不确定)。
您需要这些导入:
import com.ibm.domino.xsp.module.nsf.NSFComponentModule;
import com.ibm.domino.xsp.module.nsf.NotesContext;
import com.ibm.domino.xsp.module.nsf.SessionCloner;
该课程需要两个字段
私人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(context);
session = this.sessionCloner.getSession();
//您的代码
} catch(Throwable exception){
//错误记录,打印堆栈跟踪/等
}终于{
NotesContext.termThread();
尝试{
this.sessionCloner.recycle();
} catch(NotesException异常){}
}