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:无法完成对“java:”名称的 JNDI 操作,因为服务器运行时无法将该操作的线程与任何 J2EE 应用程序组件相关联。当使用“java:”名称的 JNDI 客户端未在服务器应用程序请求的线程上执行时,可能会发生这种情况。确保 J2EE 应用程序不会在静态代码块或由该 J2EE 应用程序创建的线程中对“java:”名称执行 JNDI 操作。此类代码不一定在服务器应用程序请求的线程上运行,因此不受“java:”名称上的 JNDI 操作的支持。

有人可以建议吗?如果无法使用java.util.Timer任务run()方法获取资源(在服务器上下文中可用),那么请提出替代方案。我什至尝试过java.util.concurrent.ScheduledExecutorService->scheduleAtFixedRate但徒劳无功。

4

1 回答 1

2

您不应TimerTask在 EJB 应用程序中使用,因为这将创建并启动ThreadJava EE 环境中不允许的自定义。

相反,使用TimerService. 它是 Java EE 标准的一部分。

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

于 2013-09-23T13:17:29.233 回答