我正在使用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();
}
}
但我得到例外:
Error looking up myName, service service jboss.naming.context.java.myName is not started
如果我在应用程序运行时尝试查找对象,一切都很好。
感谢您的帮助。
<小时/> 更新
如何将数据绑定到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
。
我不知道它是如何以及何时被摧毁的。我只确定我不会重新绑定或取消绑定它。
UPDATE2
我还尝试使用jndi路径java:comp/myName
,java:comp/env/myName
,java:/myName
,java:jboss/myName
。行为是相同的:可以在应用程序运行时查找对象,而在调用ServletContextListener.contextDestroyed
方法时无法执行此操作。