2012-06-26 3 views
1

Я смотрел пример, опубликованный на OpenNTF - http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=Threads%20and%20Jobs. Моя проблема заключается в том, что я не могу ссылаться на другой класс, который находится за пределами основного класса, который создает исходный поток.Xpage Темы - не доступны для доступа к другим классам

Это код, который я пытаюсь использовать на основе демонстрационного кода (который отлично работает BTW). Я пробовал разные варианты, включая попытку вызвать класс Broadcast внутри внутреннего класса и, как в этом случае, из внешнего класс. Во всех случаях я получаю ClassNotFoundException - NB, класс 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"); 
    } 
} 
} 

ответ

1

Если задание находится в NSF, то по соображениям безопасности он не может получить доступ к некоторым основным классам затмения. Например, это относится к IStatus. С другой стороны, если вы развертываете класс как часть подключаемого модуля, он может иметь зависимость от времени выполнения ядра eclipse. Существует также проблема с информацией о загрузчике классов в ThreadSessionExecutor, и она была исправлена ​​в следующей версии N/D. С 8.5.3 лучше, чтобы ваши рабочие места были развернуты как плагины.

+0

Благодаря Philippe я буду стараться и развернуть его как плагин и посмотреть, как она идет. – markbarton

+0

У вас есть ссылка на создание и развертывание плагина, который не для UIComponent. Я посмотрел на эти учебники здесь: http://www-10.lotus.com/ldd/ddwiki.nsf/dx/Creating_an_XPages_Library, но они предназначены для компонент пользовательского интерфейса. Это то же самое для чистого плагина на основе кода? – markbarton

+0

Проверьте комплект стартового пульта XSP: http://www.openntf.org/internal/home.nsf/project.xsp?action=openDocument&name=XSP%20Starter%20Kit –

1

Если вам нужен доступ к сеансу в потоке, вы можете использовать SessionCloner. Тогда вам не нужно разворачивать его как плагин, так как он не загружает собственный загрузчик классов. Возможно, вам придется изменить файл java.policy на сервере (я изменил java.policy перед тестированием, поэтому не уверен).

Вы нужны эти импорта:

импорта com.ibm.domino.xsp.module.nsf.NSFComponentModule;

import com.ibm.domino.xsp.module.nsf.NotesContext;

импорт com.ibm.domino.xsp.module.nsf.SessionCloner;

Класс нужны два поля

частный SessionCloner sessionCloner;

частный модуль NSFComponentModule;

В конструкторе:.

// Присвоить объекты, что необходимо пройти текущий сеанс в

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

this.sessionCloner = SessionCloner.getSessionCloner();

В способе выполнения (переместить код из анонимного класса ThreadSessionExecutor запуска метода к методу выполнения в классе Thread):

сессия сессия = NULL;

попробовать {

контекст NotesContext = новый NotesContext (это.модуль);

NotesContext.initThread (контекст);

session = this.sessionCloner.getSession();

// Ваш код

} задвижка (Throwable исключение) {

// протоколирования ошибок, печать трассировки стека/и т.д.

} наконец {

NotesContext.termThread();

попробовать {

this.sessionCloner.recycle(); 

} задвижка (NotesException исключение) {}

}

+0

Спасибо Tommy - я попробую это. – markbarton

+0

@ У вас есть идея, что SessionCloner существует для объекта SessionAsSigner? Благодаря! –

+0

... ОК, я думаю, что нашел ответ для моего комментария выше. Это: SessionCloner.getDesignerSessionCloner (false | true) .getSession() –

Смежные вопросы