我正在使用 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();
}
}
但我得到例外:
查找 myName 时出错,服务服务 jboss.naming.context.java.myName 没有启动
如果我在应用程序运行时尝试查找对象,一切都很好。
感谢您的任何帮助。
更新
我如何将数据绑定到 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
。
我不知道它是如何以及何时被摧毁的。我只确定我没有重新绑定或取消绑定它。
更新2
我也尝试使用 jndi 路径java:comp/myName
, java:comp/env/myName
, java:/myName
, java:jboss/myName
. 行为是相同的:可以在应用程序运行时查找对象,而在调用方法时无法查找ServletContextListener.contextDestroyed
。