Ho due orecchie distribuite su un'istanza di jboss. Sto usando il quarzo configurato all'interno di mbean. Entrambe le orecchie utilizzano StatefulJobs. Sfortunatamente si sta usando la libreria antlr-runtime-3.0, ma la seconda antlr-runtime-3.2. Quando JBoss sta invocando il lavoro prende la libreria sbagliata. Non so come costringerlo a usare la biblioteca dall'orecchio. La mia versione al quarzo è aggiornata alla 1.8.6. JBoss è 4.2.2 GAjava.lang.NoSuchMethodError durante il richiamo del processo al quarzo dichiarato all'interno di jboss mbean
mia prima struttura dell'orecchio:
META-INF
antlr-runtime-3.0.jar
- ejb.jar
- app .war
La mia seconda struttura dell'orecchio:
- META-INF
- application.xml
- jboss-app.xml
- antlr-runtime-3.2.jar
- ejb2.jar
- app2.war
Application.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>ear</display-name>
<module>
<web>
<web-uri>app.war</web-uri>
<context-root>/</context-root>
</web>
</module>
<module>
<ejb>app.jar</ejb>
</module>
</application>
jboss-app.xml
<?xml version='1.0' encoding='UTF-8' ?>
<jboss-app>
<loader-repository>
pck.class:app.war=unique-app.war
<loader-repository-config>java2ParentDelegation=false</loader-repository-config>
</loader-repository>
</jboss-app>
Stack:
org.quartz.SchedulerException: Problem instantiating class 'package.quartz.WsclFailureJob' - [See nested exception: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSha
redState;)V]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:147)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:364)
Caused by: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V
at package.cond.antlr.CondLexer.<init>(CondLexer.java:55)
at package.cond.antlr.CondLexer.<init>(CondLexer.java:52)
at package.cond.ExpressionFactory.getValue(ExpressionFactory.java:58)
at packagee.Configuration$ConfigInternal.loadParsableParams(Configuration.java:204)
at packagee.Configuration$ConfigInternal.reload(Configuration.java:172)
at packagee.Configuration$ConfigInternal.<init>(Configuration.java:161)
at packagee.Configuration.reload(Configuration.java:56)
at packagee.Configuration.<init>(Configuration.java:47)
at packagee.Configuration.<clinit>(Configuration.java:38)
at packagee.ScenarioProcessor.<init>(ScenarioProcessor.java:71)
at packagee.ScenarioProcessor.<clinit>(ScenarioProcessor.java:58)
at package.quartz.WsclFailureJob.<init>(WsclFailureJob.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:55)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:140)
... 1 more
Cercavo anche con java2ParentDelegation impostata su true, ma non funziona . Quando aggiungo questo file per proiettare il mio quarzo invocando da jboss, restituisco mi ClassNotFoundError durante il recupero del lavoro da quartz_table. Senza questo file tutto funziona bene, ma quando su jboss è distribuita una sola applicazione.
Stack con jboss-app.xml:
15-04-15 17:49:00,010 TRACE [RepositoryClassLoader] attempt(1) was: true for :[email protected]{ url=null ,addedOrder=25}
2015-04-15 17:49:00,010 TRACE [LoadMgr3] registerLoaderThread, [email protected]{ url=null ,addedOrder=25}, t=Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], prevT=null
2015-04-15 17:49:00,010 TRACE [LoadMgr3] Begin beginLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=null ,addedOrder=25}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] Class in blacklist, name=package.quartz.WsclFailureJob
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob not found
2015-04-15 17:49:00,010 TRACE [LoadMgr3] End beginLoadTask, ClassNotFoundException
2015-04-15 17:49:00,010 TRACE [LoadMgr3] Begin endLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=null ,addedOrder=25}, loadedClass: nullnull, loadOrder: 2147483647, loadException: null, threadTaskCount: 0, state: 0, #CCE: 0}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] release(1) for :[email protected]{ url=null ,addedOrder=25}
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] released, holds: 0
2015-04-15 17:49:00,010 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=null ,addedOrder=25} name=package.quartz.WsclFailureJob not found
2015-04-15 17:49:00,011 ERROR [JobStoreTX] Error retrieving job, setting trigger state to ERROR.
org.quartz.JobPersistenceException: Couldn't retrieve job because a required class was not found: No ClassLoaders found for: package.quartz.WsclFailureJob [See nested exception: java.lang.ClassNotFoundException: No ClassLoaders found for: package.quartz.WsclFailureJob]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1416)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2903)
at org.quartz.impl.jdbcjobstore.JobStoreSupport$38.execute(JobStoreSupport.java:2871)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.executeInNonManagedTXLock(JobStoreSupport.java:3788)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.triggerFired(JobStoreSupport.java:2
865)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:319)
Caused by: java.lang.ClassNotFoundException: No ClassLoaders found for: package.quartz.WsclFailureJob
at org.jboss.mx.loading.LoadMgr3.beginLoadTask(LoadMgr3.java:306)
at org.jboss.mx.loading.RepositoryClassLoader.loadClassImpl(RepositoryClassLoader.java:521)
at org.jboss.mx.loading.RepositoryClassLoader.loadClass(RepositoryClassLoader.java:415)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at org.quartz.simpl.InitThreadContextClassLoadHelper.loadClass(InitThreadContextClassLoadHelper.java:72)
at org.quartz.simpl.CascadingClassLoadHelper.loadClass(CascadingClassLoadHelper.java:116)
at org.quartz.impl.jdbcjobstore.StdJDBCDelegate.selectJobDetail(StdJDBCDelegate.java:894)
at org.quartz.impl.jdbcjobstore.JobStoreSupport.retrieveJob(JobStoreSupport.java:1404)
Log senza jboss-app.xml. Applicazione funziona bene quando v'è un solo distribuito su JBoss:
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClassLocally, [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.WsclFailureJob class=class package.quartz.WsclFailureJob [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.ClassLoadingTask] setLoadedClass, theClass=class package.quartz.WsclFailureJob, order=44
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.UnifiedLoaderRepository3] cacheLoadedClass, classname: package.quartz.WsclFailureJob, class: class package.quartz.WsclFailureJob, ucl: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, prevClass: null
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] Notifying task of thread completion, loadTask:[email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 1, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] End nextTask(0), [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.LoadMgr3] Begin endLoadTask, [email protected]{classname: package.quartz.WsclFailureJob, requestingThread: Thread[main,5,jboss], requestingClassLoader: [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}, loadedClass: class [email protected]5b4<CodeSource: (file:/jboss/server/default/tmp/deploy/tmp34768system.ear-contents/system.jar <no signer certificates>)>, loadOrder: 44, loadException: null, threadTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] release(1) for :[email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,370 TRACE [org.jboss.mx.loading.RepositoryClassLoader] released, holds: 0
2015-04-15 17:53:40,371 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClass [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.WsclFailureJob class=class package.quartz.WsclFailureJob [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44}
2015-04-15 17:53:40,371 TRACE [org.jboss.mx.loading.RepositoryClassLoader] loadClass [email protected]{ url=file:/jboss/server/default/tmp/deploy/tmp34768system.ear ,addedOrder=44} name=package.quartz.VerifyTimeoutJob, loadClassDepth=0
Pila senza jboss-app.xml, ma in caso di 2 applicazioni distribuite con diverse versioni della libreria di runtime antlr-:
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClassLocally, [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.Recognize
rSharedState class=class org.antlr.runtime.RecognizerSharedState [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [ClassLoadingTask] setLoadedClass, theClass=class org.antlr.runtime.RecognizerSharedState, order=48
2015-04-15 19:01:11,307 TRACE [UnifiedLoaderRepository3] cacheLoadedClass, classname: org.antlr.runtime.RecognizerSharedState, class: class org.antlr.runtime.RecognizerSharedState, ucl: [email protected]{ ur
l=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, prevClass: null
2015-04-15 19:01:11,307 TRACE [LoadMgr3] Notifying task of thread completion, loadTask:[email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzS
chedulerThread,5,QuartzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.a
ntlr.runti[email protected]196b1a5<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadEx
ception: null, threadTaskCount: 0, state: 1, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [LoadMgr3] End nextTask(0), [email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,Qua
rtzScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.antlr.runtime.Recogni
[email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadException: null, threa
dTaskCount: 0, state: 4, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [LoadMgr3] Begin endLoadTask, [email protected]{classname: org.antlr.runtime.RecognizerSharedState, requestingThread: Thread[MySystemClusteredScheduler_QuartzSchedulerThread,5,Quart
zScheduler:MySystemClusteredScheduler], requestingClassLoader: [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}, loadedClass: class org.antlr.runtime.Recognize
[email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear-contents/antlr-runtime-3.2.jar <no signer certificates>)>, loadOrder: 48, loadException: null, threadT
askCount: 0, state: 4, #CCE: 0}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] release(1) for :[email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] released, holds: 0
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.RecognizerSharedState class=class org.antlr.runtime.RecognizerSharedState [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48}
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.BitSet, loadClassDepth=0
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] Loaded class from cache, [email protected]<CodeSource: (file:/home/name/jboss/server/default/tmp/deploy/tmp34122OTHER_SYSTEM.ear-contents/antlr-runtime-3.0.jar <no signer certificates>)>
2015-04-15 19:01:11,307 TRACE [RepositoryClassLoader] loadClass [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34140system.ear ,addedOrder=48} name=org.antlr.runtime.BitSet class=class org.antlr.runtime.BitSet [email protected]{ url=file:/home/name/jboss/server/default/tmp/deploy/tmp34122OTHER_SYSTEM.ear ,addedOrder=45}
2015-04-15 19:01:11,309 ERROR [ErrorLogger] An error occured instantiating job to be executed. job= 'DEFAULT.package.quartz.WsclFailureJob'
org.quartz.SchedulerException: Problem instantiating class 'package.quartz.WsclFailureJob' - [See nested exception: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V]
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:147)
at org.quartz.core.QuartzSchedulerThread.run(QuartzSchedulerThread.java:364)
Caused by: java.lang.NoSuchMethodError: org.antlr.runtime.Lexer.<init>(Lorg/antlr/runtime/CharStream;Lorg/antlr/runtime/RecognizerSharedState;)V
at package.cond.antlr.CondLexer.<init>(CondLexer.java:55)
at package.cond.antlr.CondLexer.<init>(CondLexer.java:52)
at package.cond.ExpressionFactory.getValue(ExpressionFactory.java:58)
at package.core.Configuration$ConfigInternal.loadParsableParams(Configuration.java:204)
at package.core.Configuration$ConfigInternal.reload(Configuration.java:172)
at package.core.Configuration$ConfigInternal.<init>(Configuration.java:161)
at package.core.Configuration.reload(Configuration.java:56)
at package.core.Configuration.<init>(Configuration.java:47)
at package.core.Configuration.<clinit>(Configuration.java:38)
at package.core.ScenarioProcessor.<init>(ScenarioProcessor.java:71)
at package.core.ScenarioProcessor.<clinit>(ScenarioProcessor.java:58)
at package.quartz.WsclFailureJob.<init>(WsclFailureJob.java:22)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at org.quartz.simpl.SimpleJobFactory.newJob(SimpleJobFactory.java:55)
at org.quartz.core.JobRunShell.initialize(JobRunShell.java:140)
cercavo anche proprietà quarzo come:
org.quartz.scheduler.classLoadHelper.class=org.quartz.simpl.CascadingClassLoadHelper
org.quartz.scheduler.threadsInheritContextClassLoaderOfInitializer=true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
È possibile trovare un modo per introdurre il proprio classloader nel codice. A seconda di quanto controllo hai, puoi creare una factory che carica manualmente la classe dalla directory desiderata – kolossus
Ci stavo pensando, ma ho pensato che esista un'idea migliore ... Sembra una soluzione ... –