2010-06-11 4 views
1

Sun 응용 프로그램 서버 8.2를 새 패치 레벨로 업그레이드하는 동안 예외가 발생했으며 그 이유를 알 수 없습니다. 서블릿에서 코드를 다음과 같습니다유효한 참조가없는 loader.InputStreams가 닫힙니다.

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) 
|#] 

아무도 모를 문제가 있습니다. (코드 및 스택 트레이스의 일부 이름이 변경 되었음에 유의하십시오)

답변

1

정말 예외입니까? 우리는 항상 Glassfish에서 이런 경고를받습니다. EJBClassLoader는 Throwable을 사용하여 스택 추적을 덤프하므로 예외가 될 수 있습니다.

EJBClassLoader는 모든 스트림을 감시 항목으로 래핑합니다. 이 경고는 단순히 스트림이 닫히지 않았 음을 알려줍니다. 당신은 그것을 무시할 수 있습니다. 경고를 없애려면 사용 후 스트림을 닫아야합니다.

1

당신은 사용 후 항상 주변에는 InputStream해야합니다

finally { 
    IOUtils.closeQuietly(str); 
} 
:

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(); 
      } 
     } 
    } 
} 

은 BTW, 최종적으로 절은 아파치 평민/IO를 사용하여 훨씬 더 간단 할 수있다

관련 문제