2009-09-17 9 views
1

J'ai un emploi Quartz écrit en Java qui fonctionne bien si je la ligne Quartz JobDetail défini comme suit:nom chargement Dynamiquement du fichier de classe Java dans un emploi Quartz

JobDetail jd = new JobDetail("FeedMinersJob", scheduler.DEFAULT_GROUP, FeedMinersScheduler.class); 

Mais je voudrais charger dynamiquement la classe car les détails du travail sont stockés dans une table de base de données. Donc, je veux quelque chose comme ceci:

JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, sj.getJobClassFile()); 

Où sj est un objet tâche planifiée et la méthode sj.getJobClassFile() renvoie le nom de la classe définie dans sj au lieu d'avoir le nom de classe hardcoded.

J'ai essayé des permutations de la méthode Java Class.forName mais sans succès.

+0

Qu'avez-vous essayé et quels problèmes avez-vous rencontrés? Compiler l'erreur? Exception dans l'exécution? Aucune exception mais les résultats d'exécution ne sont pas satisfaisants? –

Répondre

0

Si je comprends bien, vous le code devrait comme ceci:

Class<?> jobClass = Class.forName(sj.getJobClassFile()); 
JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass); 

Pouvez-vous s'il vous plaît poster les extraits de code qui ne fonctionnent pas?

0

Essayez cette

try { 
    Class<?> jobClass = Class.forName(sj.getJobClassFile()); 
    JobDetail jd = new JobDetail(sj.getJobName(), scheduler.DEFAULT_GROUP, jobClass); 
} catch (ClassNotFoundException e) { 
    // put here some error handling 
} 

Et si cela ne fonctionne pas s'il vous plaît donner plus de détails sur le problème - erreur de compilation, sauf dans l'exécution ou d'un autre problème.

+0

C'est presque exactement ce que j'ai, sauf que je teste une exception. Mais il n'y a pas d'avertissement du compilateur ou d'exception d'exécution. En termes simples, rien ne se passe. –

0

Je cela, peut-être il sera utile de vous: (getClassName() retourne une chaîne)

Class<?> jobClass = Class.forName(t_job.getClassName()); 
if (Job.class.isAssignableFrom(jobClass)) { 
     // create a job detail that is not volatile and is durable (is persistent and exists without trigger) 
     JobDetail job = new JobDetail(t_job.getName(), t_job.getGroupName(), jobClass, false, true, true); 
     job.setDescription(t_job.getDescription()); 

} 
1

je suis tombé sur la même question. Il ne génère rien et ne renvoie pas d'erreur non plus. C'est parce que votre classe de travail n'a pas de constructeur vide. Ainsi, même si le code est correct, il n'a aucun mécanisme pour créer l'objet du travail. Si vous ajoutez un constructeur vide à votre classe Job, cela fonctionnera.