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
, но напрасно.
Вопрос с меткой «Java-ЭИ», но вызов JNDI происходит от 'ServletContextListener': Так это«сервлет-контейнер только»или«особенности EJB отлично», а? Как выглядит JNDI? Какой сервер приложений? Пожалуйста, покажите полный код 'run'. – Beryllium
Это веб-приложение, развернутое на сервере приложений WebSphere. Имя Jndi - «jdbc/ctc», и я обращаюсь к нему через ссылку на ресурс, которая отображается в web.xml моего веб-приложения. Я беспокоюсь о том, чтобы применить решение, данное @ isnot2bad ниже. Это может быть правильно, но, пожалуйста, дайте мне знать, смогу ли я справиться с любым другим решением, а не создавать компонент Enter Prize с событиями обратного вызова TimerService. – MyFist
Я не мог воспроизвести вашу проблему с помощью JBoss 7, используя глобальный JNDI напрямую (= без сопоставления ресурсов-ссылок в web.xml). Поэтому попробуйте использовать * глобальное имя JNDI * для поиска источника данных. Снова добавьте источник 'run()', который выполняет поиск, добавляет сопоставление ресурсов и, возможно, скриншот конфигурации источника данных в ваш вопрос. – Beryllium