Xpage线程 - 无法访问其他类

时间:2012-06-26 10:45:33

标签: java multithreading xpages

我一直在查看在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");
    }
}
}

2 个答案:

答案 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异常){}

     

}