2010-08-03 7 views
1

Je suis en cours d'exécution d'une tâche planifiée dans une application Web qui parfois (pourrait notreproduce elle) donne lieu à l'exception suivante:Accès illégal (Quartz avec JBoss)

[WebappClassLoader] Illegal access: this web application instance has been stopped already. Could not load org.quartz.StatefulJob. 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:1244) at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204) at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:169) at org.quartz.JobDetail.class$(JobDetail.java:279) at org.quartz.JobDetail.isStateful(JobDetail.java:425) at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342) 13:41:00,083 ERROR [STDERR] Exception in thread "DefaultQuartzScheduler_QuartzSchedulerThread" 13:41:00,083 ERROR [STDERR] java.lang.NoClassDefFoundError: org.quartz.StatefulJob 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.class$(JobDetail.java:279) 13:41:00,083 ERROR [STDERR] at org.quartz.JobDetail.isStateful(JobDetail.java:425) 13:41:00,083 ERROR [STDERR] at org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313) 13:41:00,083 ERROR [STDERR] at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:342)

Il a également NoClassDefFoundError. Il est dit que org.quartz.StatefulJob est introuvable. Voici comment le travail est prévu:

Scheduler sched = StdSchedulerFactory.getDefaultScheduler(); 
if (!sched.isStarted()){ 
    sched.start(); 
} 

String konf = MyConfigClass.getRow(25).getKonfiguration(); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(MyParser.stf.parse(konf)); 
String expression = "0 " + cal.get(Calendar.MINUTE) + " " + cal.get(Calendar.HOUR_OF_DAY) + " ? * MON-FRI"; 
CronTrigger ct = new CronTrigger(triggerName, group, jobName, group, expression); 

if (sched.getTrigger(triggerName, Scheduler.DEFAULT_GROUP) != null) { 
    sched.rescheduleJob(triggerName, group, ct); 
} else { 
    JobDetail jd = new JobDetail(jobName, group, MyJob.class); 
    sched.scheduleJob(jd, ct); 
} 

Je ne sais pas ce qui pourrait être le problème. D'abord j'ai pensé que la session meurt avant que le travail s'exécute, mais j'ai essayé et ce n'est pas le cas. La chose intéressante est que, après cette exception, le travail s'exécute à nouveau sans problème.

Avez-vous des idées?

+0

J'ai ajouté quelques détails pour affiner les problèmes possibles. – Atticus

Répondre

2

Il semble que votre travail à quartz essaie de faire quelque chose après l'arrêt de votre application. Il pourrait être en train d'essayer d'accéder à certaines ressources qui étaient disponibles pendant que votre application était en cours d'exécution, mais pas plus (quelque chose comme getResourceAsStream peut-être).

Il peut être utile si vous postez plus d'informations: stacktraces, le code de votre travail, etc.

Après mise à jour: Voici ce que je pense qui se passe:

  • Vous planifiez votre travail
  • avec succès
  • Pour une raison quelconque, votre webapp est arrêtée. Je rechercherais les journaux de JBoss pour une raison.
  • A ce moment de moment venu d'exécuter votre travail (org.quartz.simpl.RAMJobStore.triggerFired(RAMJobStore.java:1313))
  • Cet appel descend à isStateful méthode de JobDetail classe
  • La méthode a ce code dans ce return (StatefulJob.class.isAssignableFrom(jobClass));
  • classe StatefulJob n'a pas été chargé avant. Votre classLoader essaie de le charger (org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204))
  • Depuis votre webapp a été arrêté, vous obtenez exception

La façon dont je le vois, vous avez deux choix:

  • IGNORE ce problème, étant donné que il n'y a rien que vous pouvez faire pour rendre le travail de quartz après votre webapp a été arrêté
  • Essayez de comprendre ce qui cause votre webapp d'arrêter et de le fixer
+0

J'ai lu sur d'autres forums que cette erreur est généralement causée par une application arrêtée, mais le fait est que notre application n'a pas été arrêtée lorsque l'erreur a été levée. Comme je l'ai dit, j'ai essayé de tuer la session, c'est à dire. mettre un time-out qui expirait (j'ai enseigné que cela fermerait certaines ressources pour le travail) avant que le travail s'exécute, mais il a été exécuté sans erreurs, même si la session a expiré. – Atticus

+1

La session de fermeture n'est pas la même chose que l'arrêt de la webapp. Dans votre code je ne vois rien de lié à la session. Donc, l'expiration des sessions n'aidera pas à suivre le problème, je pense. –

+0

La chose intéressante est que, après que cette exception s'est produite, le travail s'exécute à nouveau et il parvient à finir. Peut-être que certaines ressources ne sont pas disponibles lorsque vous essayez d'exécuter le travail, mais ensuite il accède à eux et exécute le travail.BTY est le quartz capable de faire une telle chose, je veux dire réexécuter les travaux échoués? – Atticus