web-dev-qa-db-fra.com

Accès illégal: cette instance d'application Web a déjà été arrêtée

J'ai une classe qui a une méthode init définie en xml

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

ma classe:

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

}

Lorsque l'application démarre, ces threads fonctionnent bien, et tout fonctionne très bien et après un certain temps, je reçois l'exception suivante.

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)

dans la méthode doStuff:

public void doStuff(){

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

}

Je ne sais pas pourquoi, des idées?

21
Mahmoud Saleh

Problème résolu après le redémarrage de Tomcat et Apache, le Tomcat mettait en cache l'ancienne version de l'application.

27
Mahmoud Saleh

En bref: cela se produit probablement lorsque vous déployez à chaud des webapps. Par exemple, votre serveur de développement ide + déploie à nouveau une guerre à chaud. Les threads créés précédemment sont toujours en cours d'exécution. Mais en attendant, leur chargeur de classe/contexte n'est pas valide et fait face à IllegalAccessException/IllegalStateException car sa webapp d'origine (l'ancien environnement d'exécution) a été redéployée.

Ainsi, comme indiqué ici, un redémarrage ne résout pas définitivement ce problème. Au lieu de cela, il vaut mieux trouver/implémenter un Thread Pool géré, s.th. comme ceci pour gérer la terminaison des threads de manière appropriée. Dans JavaEE, vous utiliserez ces ManagedThreadExeuctorServices. ne opinion et une référence similaires ici .

Par exemple, EvictorThread d'Apache Commons Pool, qui "nettoie" les instances regroupées en fonction de la configuration du pool (max idle, etc.).

10
Jens Kreidler

Je soupçonne que cela se produit après une tentative de retrait de votre application. Avez-vous déjà éliminé ce fil que vous avez initialisé pendant le processus init()? Je le ferais dans la méthode destroy() correspondante.

8
Brian Agnew

J'ai rencontré ce problème lors de l'arrêt d'Apache Tomcat et je l'ai modifié en supprimant tous les projets sur Apache.

0

Le redémarrage de votre serveur peut résoudre ce problème.

J'obtenais la même erreur lors de l'utilisation de Dynamic Jasper Reporting, lorsque je déploie mon application pour la première utilisation pour créer des rapports, la création de rapport fonctionne correctement, mais une fois que je fais un déploiement à chaud de certaines modifications de code sur le serveur, j'obtenais cette erreur.

0
Aadil Masavir