【问题标题】:JNDI look up is failing with in java.util.TimerTaskJNDI 查找在 java.util.TimerTask 中失败
【发布时间】:2013-09-23 13:09:44
【问题描述】:
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,但没有成功。

【问题讨论】:

  • 这个问题被标记为“java-ee”,但是 JNDI 调用来自 ServletContextListener:那么它是“servlet-container-only”还是“EJB features are fine”呢? JNDI名字怎么看? Which application server? Please show the full code of run`。
  • 这是一个部署在WebSphere应用服务器中的Web应用。 Jndi 名称是“jdbc/ctc”,我通过在我的 Web 应用程序的 web.xml 中映射的资源引用来访问它。我担心应用下面@isnot2bad 给出的解决方案。这可能是正确的,但如果我可以使用任何其他解决方案而不是使用 TimerService 回调事件创建 Enter Prize bean,请告诉我。
  • 我无法通过 JBoss 7 直接使用全局 JNDI 重现您的问题(= web.xml 中没有资源引用映射)。因此,请尝试使用 全局 JNDI 名称 来查找数据源。再次添加执行查找的run() 的源,添加资源映射,并可能将数据源配置的屏幕截图添加到您的问题中。
  • 感谢您的回复。正如我所说,如果我使用全局 JNDI 名称,即使我也不会遇到任何问题。但是直接在代码中使用 JNDI 名称与服务器配置紧密耦合。因此我不允许这样做:-(
  • 但是您被允许创建非托管线程吗?我从未见过任何真正使用额外重定向的数据中心。无论如何,在您的情况下,只需使用系统属性、上下文参数或单独的 .properties 文件来配置全局 JNDI 名称,以便数据中心可以更改它的值(我敢打赌他们永远不会更改它)。

标签: java jakarta-ee websphere java-5


【解决方案1】:

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

改为使用TimerService。它是 Java EE 标准的一部分。

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

【讨论】:

  • 嗨,迈克,我按照你的建议尝试了。我创建了 javax.ejb.TimerService 但得到了同样的异常:-(你能建议任何其他解决方案吗?
猜你喜欢
  • 2019-03-19
  • 2013-06-29
  • 2018-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
相关资源
最近更新 更多