[英]JNDI look up is failing with in java.util.TimerTask
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.
}
我在使用資源引用從服務器上下文獲取數據源連接時收到JNDI查找錯誤。 請注意,如果我不使用TimerTask
,則查找工作正常。
javax.naming.ConfigurationException:無法完成對“ java:”名稱的JNDI操作,因為服務器運行時無法將操作的線程與任何J2EE應用程序組件相關聯。 當未在服務器應用程序請求的線程上執行使用“ java:”名稱的JNDI客戶端時,會發生這種情況。 確保J2EE應用程序不在靜態代碼塊內或該J2EE應用程序創建的線程中的“ java:”名稱上執行JNDI操作。 這樣的代碼不一定在服務器應用程序請求的線程上運行,因此JNDI操作對“ java:”名稱不支持。
有人可以建議嗎? 如果無法使用java.util.Timer
任務run()
方法獲取資源(在服務器上下文中可用),請提出一個替代方案。 我什至嘗試使用java.util.concurrent.ScheduledExecutorService
> scheduleAtFixedRate
但徒勞。
您不應在EJB應用程序中使用TimerTask
,因為這將創建並啟動Java EE環境中不允許的自定義Thread
。
而是使用TimerService
。 它是Java EE標准的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.