2013-09-23 5 views
1
public class ReferenceDataTimer extends TimerTask 
{ 
    private static ReferenceDataTimer refDataTimerTask = new ReferenceDataTimer(); 
    private Timer refDataTimer = null; 
    public void start() 
    { 
     refDataTimer = new Timer(); 
     refDataTimer.schedule(refDataTimerTask, DELAY, refreshTime*PERIOD); 
    } 

    @Override 
    public void run() 
    { 
    // Get DB connection using 
    // InitialContext lookup 
    // using resource reference    

    => This is where it is failing. lookup is not working from this run() method of timer task. 

    // Then load the data to cache 

    } 
} 

public class ReferenceDataManager implements ServletContextListener { 
// Invoking ReferenceDataTimer -> start() method. 
} 

И Im получает ошибку поиска JNDI при получении источника данных Подключение из контекста сервера с использованием ссылки на ресурс. Обратите внимание, что найдите РАБОТУ, если я не использую TimerTask.JNDI поиск не работает с java.util.TimerTask

javax.naming.ConfigurationException: Операция JNDI на «Java:» Имя не может быть завершена, поскольку во время выполнения сервер не в состоянии связать нить часть операции с любым компонентом приложения J2EE. Это условие может возникнуть, когда клиент JNDI, использующий имя «java:», не выполняется в потоке запроса на серверный запрос. Убедитесь, что приложение J2EE не выполняет JNDI-операции с именами «java:» в статических блоках кода или в потоках, созданных этим приложением J2EE. Такой код не обязательно запускается в потоке запроса на серверный запрос и поэтому не поддерживается операциями JNDI в именах «java:».

Может кто-нибудь предложить? Если невозможно получить ресурс (доступный в контексте сервера) с помощью java.util.Timer задачи run(), то, пожалуйста, предложите альтернативу. Я даже пробовал с java.util.concurrent.ScheduledExecutorService ->scheduleAtFixedRate, но напрасно.

+0

Вопрос с меткой «Java-ЭИ», но вызов JNDI происходит от 'ServletContextListener': Так это«сервлет-контейнер только»или«особенности EJB отлично», а? Как выглядит JNDI? Какой сервер приложений? Пожалуйста, покажите полный код 'run'. – Beryllium

+0

Это веб-приложение, развернутое на сервере приложений WebSphere. Имя Jndi - «jdbc/ctc», и я обращаюсь к нему через ссылку на ресурс, которая отображается в web.xml моего веб-приложения. Я беспокоюсь о том, чтобы применить решение, данное @ isnot2bad ниже. Это может быть правильно, но, пожалуйста, дайте мне знать, смогу ли я справиться с любым другим решением, а не создавать компонент Enter Prize с событиями обратного вызова TimerService. – MyFist

+0

Я не мог воспроизвести вашу проблему с помощью JBoss 7, используя глобальный JNDI напрямую (= без сопоставления ресурсов-ссылок в web.xml). Поэтому попробуйте использовать * глобальное имя JNDI * для поиска источника данных. Снова добавьте источник 'run()', который выполняет поиск, добавляет сопоставление ресурсов и, возможно, скриншот конфигурации источника данных в ваш вопрос. – Beryllium

ответ

2

Вы не должны использовать TimerTask в приложении EJB, так как это создаст и запустит пользовательский Thread, который не разрешен в среде Java EE.

Вместо этого используйте TimerService. Он является частью стандарта Java EE.

http://docs.oracle.com/javaee/6/tutorial/doc/bnboy.html

+0

Привет, Майк, я попробовал, как и предложил. Я создал javax.ejb.TimerService, но получаю такое же исключение :-(Может ли предложить другое решение? – MyFist

+0

Привет, isot2bad, ваше предложение работает. Thnks. – MyFist

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