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.
}

リソース参照を使用してサーバーコンテキストからデータソース接続を取得しているときに、JNDI ルックアップエラーが発生します。を使用しない場合は、ルックアップが機能していることに注意してくださいTimerTask

javax.naming.ConfigurationException: サーバー ランタイムが操作のスレッドを J2EE アプリケーション コンポーネントに関連付けることができないため、"java:" 名に対する JNDI 操作を完了できません。この状態は、「java:」名を使用する JNDI クライアントがサーバー アプリケーション要求のスレッドで実行されない場合に発生する可能性があります。J2EE アプリケーションが、静的コード ブロック内またはその J2EE アプリケーションによって作成されたスレッド内の「java:」名に対して JNDI 操作を実行しないようにしてください。このようなコードは、必ずしもサーバー アプリケーション要求のスレッドで実行されるとは限らないため、"java:" 名に対する JNDI 操作ではサポートされません。

誰でも提案できますか?java.util.Timerタスクメソッドでリソース (サーバー コンテキストで利用可能) を取得できない場合run()は、別の方法を提案してください。java.util.concurrent.ScheduledExecutorService->でも試してみましscheduleAtFixedRateたが、無駄でした。

4

1 に答える 1