1

我正在使用 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

4

1 回答 1

0

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

于 2012-10-13T23:04:03.400 回答