【发布时间】: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 ofrun`。 -
这是一个部署在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