2011-02-09 2 views
12

안녕하세요 모두 난 클래스가 초기화 메소드를 xml불법 액세스 :이 웹 응용 프로그램 인스턴스가 이미 중지되었습니다.

<bean id="appStarter" class="com.myapp.myClass" init-method="init" destroy-method="destroy"/> 
<bean id="appStarter" class="com.myapp.myClass" init-method="init" destroy-method="destroy"/> 

myClass :

public class myClass{ 

    private Thread t; 

    public void init() { 

      t = new Thread() { 

       @Override 
       public void run() { 
        while (true) 
         try { 
          doStuff(); 
          Thread.sleep(1000); 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
       } 

      }; 
      t.start(); 
     } 

public void destroy() { 
     t.interrupt(); 
    } 

} 

이 응용 프로그램을 시작할 때이 스레드가 잘 실행되는 및 모든 일을 잘 및 언젠가 후에 작동합니다. 나는 다음과 같은 예외가있어

INFO: Illegal access: this web application instance has been stopped already. Could not load com.sun.mail.imap.IMAPStore. The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact. 
java.lang.IllegalStateException 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1273) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1233) 
    at javax.mail.Session.getService(Session.java:755) 
    at javax.mail.Session.getStore(Session.java:569) 
    at javax.mail.Session.getStore(Session.java:531) 
    at javax.mail.Session.getStore(Session.java:510) 
doStuff 메서드 :

public void doStuff(){ 

Session sessioned = Session.getDefaultInstance(System.getProperties(), 
       null); 
     Store store = sessioned.getStore("imap"); 
     store.connect(hostName, userName, password); 
. 
. 
. 

} 

왜 어떤 아이디어를 모르겠습니까?

답변

22

Tomcat 및 Apache를 다시 시작한 후 문제가 해결되어 Tomcat이 이전 버전의 응용 프로그램을 캐싱하고있었습니다.

+13

어떻게 이것을 영구히 고칠 수 있습니까? 이 문제의 근본 원인은 무엇입니까? 왜냐하면 내 제작 응용 프로그램이 충돌하기 때문입니다. 나는 항상 서버를 다시 시작하고 싶지 않습니다. 도움이 필요합니다. – vissu

+0

두 번째로 Tomcat을 다시 시작하면 문제가 사라집니다. – Gruber

+1

이것은 hotdeployment 문제 + 이미 시작된 스레드 일 가능성이 큽니다. 아마도 자신의 스레드가 아닌 타사 라이브러리의 스레드 일 것입니다. [내 대답을 참조하십시오] (http://stackoverflow.com/a/41503819/1075524). –

6

귀하의 앱을 배포 취소하려는 시도가 발생한 것으로 의심됩니다. init() 과정에서 초기화 한 kill off that thread을 본 적이 있습니까? 해당 destroy() 메서드에서이 작업을 수행 할 것입니다.

+0

오른쪽, 배포 취소 후에 발생하며이 스레드를 죽이지는 않습니다. 어떻게 수행합니까? 조언하십시오. –

+1

일부 검색 후 코드에 몇 가지 변경 사항을 적용 했는데도 여전히 동일한 오류가 발생합니다. 위의 코드에서 변경 사항을 확인할 수 있습니까? –

+0

파괴 메서드에서 인터럽트를 사용하는 경우에도 여전히 동일한 예외가 발생합니다. –

4

간단히 말해서 웹 응용 프로그램을 최신 버전으로 배포 할 때 발생합니다. 예를 들어, ide + 개발 서버가 전쟁을 다시 배포합니다. 이전에 작성된 스레드는 계속 실행 중입니다. 그러나 클래스 로더/컨텍스트는 유효하지 않으며, orgininating webapp (이전 런타임 환경)가 재배포 되었기 때문에 IllegalAccessException/IllegalStateException이 발생합니다.

여기 상태가 그대로 재시작해도이 문제가 영구적으로 해결되지 않습니다. 대신 관리되는 스레드 풀을 찾아서 구현하는 것이 좋습니다. 이렇게하면 스레드의 종료를 적절하게 처리 할 수 ​​있습니다. JavaEE에서는 이러한 ManagedThreadExeuctorServices를 사용합니다. A similar opinion and reference here.

예를 들어 Apache Commons Pool의 EvictorThread는 풀 구성 (최대 유휴 상태 등)에 따라 풀 인스턴스를 "정리"합니다.

관련 문제