Java ServletContextListener.ContextListener中的JNDI查找
我正在使用JBoss7.1.1和ServletAPI2.5 我必须在应用程序关闭时关闭JNDI中的一些对象 我使用ServletContextListener的目的是:Java ServletContextListener.ContextListener中的JNDI查找,java,jndi,jboss7.x,servlet-listeners,Java,Jndi,Jboss7.x,Servlet Listeners,我正在使用JBoss7.1.1和ServletAPI2.5 我必须在应用程序关闭时关闭JNDI中的一些对象 我使用ServletContextListener的目的是: public class MyServletContextListener implements ServletContextListener { ... @Override public void contextDestroyed(ServletContextEvent sce) {
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
当应用程序运行时,可以通过以下路径TASK\u CLIENT\u JNDI\u NAME访问该对象。但当调用ContextDestroy时,我有NamingException
我不知道它是怎么被摧毁的,什么时候被摧毁的。我只确定我没有重新绑定或解除绑定
更新2
我还尝试使用jndi路径java:comp/myName、java:comp/env/myName、java:/myName、java:jboss/myName。行为是一样的:应用程序运行时可以查找对象,调用ServletContextListener.contextDestroyed方法时无法查找对象。在我看来像JBoss bug,我创建了如何关闭应用程序?您是否停止JBoss实例?@Funtik如果我关闭JBoss实例并取消部署应用程序,行为是相同的。您已经提到要关闭应用程序。你是怎么做到的?您是否使用JBoss管理控制台进行此操作?或者你只是关闭整个JBoss实例?@Funtik我通过两种方式关闭应用程序:第一种是使用maven插件的standart undeploy,但我认为使用管理控制台的undeploy是相同的,第二种是关闭整个JBoss实例。两种方法的工作方式不一样。@GrigoryKalabin可能有点傻,但当应用程序运行时,您能从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);
}
}
}