loader.InputStreams без действительной ссылки закрывается - PullRequest
1 голос
/ 11 июня 2010

При обновлении сервера приложений Sun 8.2 до нового уровня патча произошло исключение, и я не знаю почему.После фрагмента кода из Сервлета :

public void init() throws ServletException {
    Properties reqProperties = new Properties();
    try {
        reqProperties.load(this.getClass().getResourceAsStream(
                "/someFile.properties"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    ...
}

Файл действительно существует в пути к классам, и в предыдущих версиях исправлений он работал просто отлично.но теперь при развертывании этого результата возникает исключение.Трассировка стека:

[#|2010-04-14T16:43:48.208+0200|WARNING|sun-appserver-ee8.2|javax.enterprise.system.core.classloading|_ThreadID=11;|loader.InputStreams with no valid reference is closed
java.lang.Throwable
    at com.sun.enterprise.loader.EJBClassLoader$SentinelInputStream.<init>(EJBClassLoader.java:1172)
    at com.sun.enterprise.loader.EJBClassLoader.getResourceAsStream(EJBClassLoader.java:858)
    at java.lang.Class.getResourceAsStream(Class.java:1998)
    at a.package.TestServlet.init(TestServlet.java:44)
    at javax.servlet.GenericServlet.init(GenericServlet.java:261)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1093)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:931)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4183)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4535)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:241)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:847)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:483)
    at org.apache.catalina.startup.Embedded.start(Embedded.java:894)
    at com.sun.enterprise.web.WebContainer.start(WebContainer.java:741)
    at com.sun.enterprise.web.HttpServiceWebContainer.startInstance(HttpServiceWebContainer.java:963)
    at com.sun.enterprise.web.HttpServiceWebContainerLifecycle.onStartup(HttpServiceWebContainerLifecycle.java:50)
    at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:300)
    at com.sun.enterprise.server.PEMain.run(PEMain.java:308)
    at com.sun.enterprise.server.PEMain.main(PEMain.java:221)
|#]

Понятия не имею, в чем может быть проблема, у кого-нибудь есть идеи?(обратите внимание, что я изменил некоторые имена в коде и трассировке стека)

Ответы [ 2 ]

1 голос
/ 11 июня 2010

Вы всегда должны закрывать входные потоки после использования:

public void init() throws ServletException {
    InputStream str = null;
    Properties reqProperties = new Properties();
    try {
        str = this.getClass().getResourceAsStream("/someFile.properties");
        reqProperties.load(str);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (str != null) {
            try {
                str.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

Кстати, предложение finally можно сделать намного проще, используя apache commons / io:

finally {
    IOUtils.closeQuietly(str);
}
1 голос
/ 11 июня 2010

Вы уверены, что это исключение?В Glassfish мы постоянно получаем подобные предупреждения.EJBClassLoader использует метод throwable для выгрузки трассировки стека, поэтому он может выглядеть для вас как исключение.

EJBClassLoader оборачивает все потоки сторожами.Это предупреждение просто говорит вам, что ваш поток не закрыт.Вы можете смело игнорировать это.Чтобы избавиться от предупреждения, вы должны закрыть поток после его использования.

...