我正在使用 JBoss 7.1.1 和 servlet-api 2.5。
我必须在应用程序关闭时关闭位于 JNDI 中的一些对象。
我正在使用ServletContextListener
为此目的:
public class MyServletContextListener implements ServletContextListener {
...
@Override
public void contextDestroyed(ServletContextEvent sce) {
((TaskClient) new InitialContext().lookup("myName")).disconnect();
}
}
但我得到了异常(exception):
Error looking up myName, service service jboss.naming.context.java.myName is not started
If I try to lookup the object when application is running everything is fine.
Thank you for any help.
update
How I bind data to jndi:
public class MyJbpmServletContextListener implements ServletContextListener {
public static final String TASK_CLIENT_JNDI_NAME = "myJbpmTaskClient";
private Log logger = SLF4JLogFactory.getLog(getClass());
@Override
public void contextInitialized(ServletContextEvent sce) {
try {
TaskClient tc = ...
// long initialization of TaskClient
InitialContext context = new InitialContext();
context.bind(TASK_CLIENT_JNDI_NAME, client);
} catch (NamingException exception) {
logger.error("Cannot bind task client", exception);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
try {
((TaskClient) new InitialContext().lookup(TASK_CLIENT_JNDI_NAME)).disconnect();
} catch (NamingException exception) {
logger.error("Cannot obtain task client", exception);
}
}
}
可通过以下路径访问该对象 TASK_CLIENT_JNDI_NAME
当应用程序运行时。但是当 contextDestroyed
叫我有NamingException
.
我不知道它是如何以及何时被摧毁的。我只确定我没有重新绑定(bind)或取消绑定(bind)它。
<小时/>更新2
我还尝试使用jndi路径java:comp/myName
, java:comp/env/myName
, java:/myName
, java:jboss/myName
。行为是相同的:应用程序运行时可以查找对象,而 ServletContextListener.contextDestroyed
时则无法查找对象。调用的方法。
最佳答案
对我来说看起来像是一个 JBoss bug,我创建了 AS7-5746
关于java - ServletContextListener.contextDestroyed 中的 JNDI 查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12497538/