Hallo zusammen,
ich hab hier einen Fehler, der es locker auf meine persönliche Top 3 Liste der merkwürdigsten Fehler schafft...
Ich versuche mich kurz zu fassen:
- Ich habe eine Servlet-Applikation in der Version 1.0. Diese ist spring-konfiguriert und wird über ant als war-file gepackt.
In dieser Applikation starte ich über das quartz-framework diverse jobs.
- Diese läuft sowohl auf meinem Testsytem als auch auf meinen Produktivsystemen.
- Nun hab ich Version 1.1 fertiggestellt
- Diese läuft nur auf meinem Testsytem jedoch __nicht__ auf meinen Produktivsystemen.
- Der Fehler:
Ja, das ist das Problem. Es gibt keinen Fehler. Die Applikation "hängt" einfach, weder über log4j noch über catalina.out gibt es irgendwelche Fehlermeldungen / exceptions.
Die relevante Codestelle (die "unsinnigen" Logmeldungen wurden nachträglich eingefügt um auf den Produktiv-Systemen nachzuvollziehen wo es hängt):
Mein Servlet wird per Tomcat-Direktive "load-on-startup" gestartet, die init() sieht so aus:
Ganz zum Schluß wird startJobs() aufgerufen:
Die startet (Überraschung.... nun meine Jobs:
Eine "normale" log-Ausgabe auf meinem Testsystem sieht nun so aus:
Auf meinem Produktivsystem sieht es hingegen so aus:
Wie an den Debug-Ausgaben zu sehen ist, kommt die Applikation bis hierhin
Jedoch nicht mehr bis
Sie hängt also folglich genau an der Zeile:
Wie schon gesagt, keine Fehlermeldungen, nichts.
Nun hab ich mir den sourcecode von JobDetail gezogen (aus dem Quartz-Framework) und mir mal angeschaut was bei diesem Konstruktur-Aufruf passiert:
Alle Methoden-Aufrufe sind stinknormale Setter:
Tja, das sieht doch soweit alles unkritisch aus........
Ich verstehe es nicht, ich habe:
- von V 1.0 zu V1.1 __nichts__ an der Initialisierung geändert, sprich der Code ist identisch geblieben.
- wie kann denn das Ding überhaupt hängen?
Mir ist klar, das mir wahrscheinlich keiner eine direkte Lösung sagen kann, aber für jeden Stupser in die richtige Richtung wäre ich dankbar.........
ich hab hier einen Fehler, der es locker auf meine persönliche Top 3 Liste der merkwürdigsten Fehler schafft...
Ich versuche mich kurz zu fassen:
- Ich habe eine Servlet-Applikation in der Version 1.0. Diese ist spring-konfiguriert und wird über ant als war-file gepackt.
In dieser Applikation starte ich über das quartz-framework diverse jobs.
- Diese läuft sowohl auf meinem Testsytem als auch auf meinen Produktivsystemen.
- Nun hab ich Version 1.1 fertiggestellt
- Diese läuft nur auf meinem Testsytem jedoch __nicht__ auf meinen Produktivsystemen.
- Der Fehler:
Ja, das ist das Problem. Es gibt keinen Fehler. Die Applikation "hängt" einfach, weder über log4j noch über catalina.out gibt es irgendwelche Fehlermeldungen / exceptions.
Die relevante Codestelle (die "unsinnigen" Logmeldungen wurden nachträglich eingefügt um auf den Produktiv-Systemen nachzuvollziehen wo es hängt):
Mein Servlet wird per Tomcat-Direktive "load-on-startup" gestartet, die init() sieht so aus:
Code:
public void init(){
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
this.jobStarter = (JobStarter) ctx.getBean("JobStarter");
this.outPrinter = (OutPrinter) ctx.getBean("OutPrinter");
initLogging();
startJobs();
}
Ganz zum Schluß wird startJobs() aufgerufen:
Code:
private void startJobs() {
logger.info("vor 'startJobs()' ......");
jobStarter.startJobs();
logger.info("nach 'startJobs()'!");
}
Die startet (Überraschung.... nun meine Jobs:
Code:
public void startJobs() {
logger.info("entered startJobs()....");
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
logger.info("SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();");
Scheduler scheduler = null;
try {
scheduler = schedulerFactory.getScheduler();
logger.info("scheduler = schedulerFactory.getScheduler();");
} catch (SchedulerException e) {
logger.info("SchedulerException!");
logger.fatal(e.getMessage());
logger.fatal(e);
}
/*
* filemon
*/
logger.info("Before: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'");
JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);
logger.info("After: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'");
Eine "normale" log-Ausgabe auf meinem Testsystem sieht nun so aus:
Code:
INFO (Sender.initLogging) 2007-06-27 11:24:24,930
LOGGING_INITIALIZED
INFO (Sender.initLogging) 2007-06-27 11:24:24,934
initLogging wird verlassen......
INFO (Sender.startJobs) 2007-06-27 11:24:24,934
vor 'startJobs()' ......
INFO (JobStarter.startJobs) 2007-06-27 11:24:24,935
entered startJobs()....
INFO (JobStarter.startJobs) 2007-06-27 11:24:24,953
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,035
scheduler = schedulerFactory.getScheduler();
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,035
Before: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,046
After: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,057
vor scheduler-aufrufen......
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,059
INFO_ALL_JOBS_SCHEDULED
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,061
INFO_ALL_JOBS_STARTED
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,063
nach scheduler-aufrufen!
INFO (Sender.startJobs) 2007-06-27 11:24:25,064
nach 'startJobs()'!
Auf meinem Produktivsystem sieht es hingegen so aus:
Code:
INFO (Sender.initLogging) 2007-06-26 14:36:18,001
LOGGING_INITIALIZED
INFO (Sender.initLogging) 2007-06-26 14:36:18,012
initLogging wird verlassen......
INFO (Sender.startJobs) 2007-06-26 14:36:18,015
vor 'startJobs()' ......
INFO (JobStarter.startJobs) 2007-06-26 14:36:18,017
bin in startJobs!!!
INFO (JobStarter.startJobs) 2007-06-26 14:36:18,111
SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
INFO (JobStarter.startJobs) 2007-06-26 14:36:19,216
scheduler = schedulerFactory.getScheduler();
INFO (JobStarter.startJobs) 2007-06-27 11:24:25,035
Before: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'
Wie an den Debug-Ausgaben zu sehen ist, kommt die Applikation bis hierhin
Code:
logger.info("Before: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'");
Jedoch nicht mehr bis
Code:
After: 'JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);'
Sie hängt also folglich genau an der Zeile:
Code:
JobDetail jobDetailFileMonitor = new JobDetail(OutputConstants.JOB_NAME_FILE_MONITOR, null, com.meinarbeitgeber.filetransfer.sft.jobs.JobFileMonitor.class);
Wie schon gesagt, keine Fehlermeldungen, nichts.
Nun hab ich mir den sourcecode von JobDetail gezogen (aus dem Quartz-Framework) und mir mal angeschaut was bei diesem Konstruktur-Aufruf passiert:
Code:
public JobDetail(String name, String group, Class jobClass) {
setName(name);
setGroup(group);
setJobClass(jobClass);
}
Alle Methoden-Aufrufe sind stinknormale Setter:
Code:
/**
*
* Set the name of this <code>Job</code>.
* </p>
*
* @exception IllegalArgumentException
* if name is null or empty.
*/
public void setName(String name) {
if (name == null || name.trim().length() == 0) {
throw new IllegalArgumentException("Job name cannot be empty.");
}
this.name = name;
}
/**
*
* Set the group of this <code>Job</code>.
* </p>
*
* @param group if <code>null</code>, Scheduler.DEFAULT_GROUP will be used.
*
* @exception IllegalArgumentException
* if the group is an empty string.
*/
public void setGroup(String group) {
if (group != null && group.trim().length() == 0) {
throw new IllegalArgumentException(
"Group name cannot be empty.");
}
if (group == null) {
group = Scheduler.DEFAULT_GROUP;
}
this.group = group;
}
/**
*
* Set the instance of <code>Job</code> that will be executed.
* </p>
*
* @exception IllegalArgumentException
* if jobClass is null or the class is not a <code>Job</code>.
*/
public void setJobClass(Class jobClass) {
if (jobClass == null) {
throw new IllegalArgumentException("Job class cannot be null.");
}
if (!Job.class.isAssignableFrom(jobClass)) {
throw new IllegalArgumentException(
"Job class must implement the Job interface.");
}
this.jobClass = jobClass;
}
Tja, das sieht doch soweit alles unkritisch aus........
Ich verstehe es nicht, ich habe:
- von V 1.0 zu V1.1 __nichts__ an der Initialisierung geändert, sprich der Code ist identisch geblieben.
- wie kann denn das Ding überhaupt hängen?
Mir ist klar, das mir wahrscheinlich keiner eine direkte Lösung sagen kann, aber für jeden Stupser in die richtige Richtung wäre ich dankbar.........