2011-02-09 178 views
12

hola a todos tengo una clase tiene un init-método definido en XMLAcceso ilegal: esta instancia de aplicación web ha sido ya detenido

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

} 

cuando se inicia la aplicación de este hilos funciona bien, y todo funciona muy bien y después de algún tiempo tengo la siguiente excepción

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) 

en el método hacerTarea:

public void doStuff(){ 

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

} 

no sé por qué, alguna idea?

Respuesta

22

Problema resuelto después de reiniciar el tomcat y apache, el tomcat estaba almacenando en caché la versión anterior de la aplicación.

+13

¿Cómo puedo solucionar esto de forma permanente? ¿Cuál es la causa raíz de este problema? Porque está bloqueando mi aplicación de producción. No quiero reiniciar servidores todo el tiempo ... Necesito ayuda. – vissu

+0

En segundo lugar, un reinicio de Tomcat hizo que el problema desapareciera. – Gruber

+1

Es probable que se trate de un problema de implementación en caliente + de hilos iniciados, probablemente no de hilos propios, sino de bibliotecas de terceros. [Vea mi respuesta aquí] (http://stackoverflow.com/a/41503819/1075524). –

6

Sospecho que esto ocurre después de un intento de cancelar el despliegue de su aplicación. ¿Alguna vez kill off that thread que ha inicializado durante el proceso init()? Haría esto en el método correspondiente destroy().

+0

bien, ocurre después de la desinstalación, y no elimino este hilo, ¿cómo hacerlo? –

+1

bien después de algunas búsquedas hice algunos cambios en el código, pero sigo teniendo el mismo error, ¿pueden ver los cambios en el código anterior? –

+0

incluso cuando utilicé la interrupción en el método de destrucción, sigo recibiendo la misma excepción –

4

En resumen: esto sucede probablemente cuando está implementando webapps. Por ejemplo, su servidor de desarrollo ide + despliega una guerra de nuevo. Los hilos que se han creado previamente todavía se están ejecutando. Pero mientras tanto, su classloader/context no es válido y se enfrenta a IllegalAccessException/IllegalStateException porque su aplicación de Internet (the runtime-environment) ha sido redistribuida.

Por lo tanto, como se indica aquí, un reinicio no resuelve permanentemente este problema. En cambio, es mejor encontrar/implementar un grupo de subprocesos administrado, s.th. así para manejar la terminación de hilos apropiadamente. En JavaEE utilizará estos ManagedThreadExeuctorServices. A similar opinion and reference here.

Ejemplos de esto son EvictorThread of Apache Commons Pool, que "limpia" instancias agrupadas de acuerdo con la configuración del conjunto (máximo inactivo, etc.).

Cuestiones relacionadas