ServletContextListener.contextDestroyed中的JNDI查找

时间:2012-09-19 15:08:42

标签: java jndi jboss7.x servlet-listeners

我正在使用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/myNamejava:comp/env/myNamejava:/myNamejava:jboss/myName。行为是相同的:可以在应用程序运行时查找对象,而在调用ServletContextListener.contextDestroyed方法时无法执行此操作。

1 个答案:

答案 0 :(得分:0)

对我来说看起来像JBoss的错误,我创建了AS7-5746