Java Excel POI stoppt nach mehrfacher Ausführung durch Quarz

Ich hätte gerne ein paar Einblicke.

Ich habe ein Programm, das von einer Datenbank in eine Excel-Datei liest und schreibt. Die Ausführung basiert auf einem Timer mit Quarz-API und wird jeden Dienstag der Woche ausgelöst. Das Problem ist, wenn ich es getestet habe, indem ich die stündliche Ausführung des Jobs eingeplant habe, stoppt das Programm plötzlich nach ein paar Ausführungen während des Schreibens der Excel-Datei. Hier ist mein Code für Excel.

try {
        FileInputStream file = new FileInputStream(excelFile);
        POIFSFileSystem myFileSystem = new POIFSFileSystem(file);
        HSSFWorkbook workbook = new HSSFWorkbook(myFileSystem);
        HSSFSheet worksheet = workbook.getSheetAt(0);
        this.cellStyle00 = workbook.createCellStyle();
        HSSFDataFormat df = workbook.createDataFormat();
        this.cellStyle00.setDataFormat(df.getFormat("00"));

for(int i = 0;i<Access.size();i++){
         AccessorMethods SetGet = (AccessorMethods)
                    InstlibAccessor.get(i);

    HSSFRow row = worksheet.createRow(worksheet.getPhysicalNumberOfRows());
    HSSFCell cell = row.createCell(0);

    cell.setCellValue(new Double(SetGet.getOne()));
    cell.setCellStyle(cellStyle00);


  //other set value codes....

}
FileOutputStream fileOut = new FileOutputStream(fileName + ".xls");
workbook.write(fileOut);
 fileOut.flush();
 fileOut.close(); 

 //catch statements follow
 //end

Die Kommandozeilenausgabe und die NetBeans-Ausgabe zeigen keine Fehler wie Speichermangel usw. usw. an. Das Programm endet nicht. Es stoppt einfach. Als würde der JVM an einer Endlosschleife arbeiten Zu diesem Thema gibt es hier einen kurzen Überblick über mein Programm.

Der Benutzer führt den Scheduler ausZum gewünschten Zeitpunkt führt der Scheduler das Programm aus (der Scheduler und "das Programm" sind zwei verschiedene Programme / JAR-Dateien. Der Scheduler ruft nur das JAR auf).Das Programm beginnt mit der Erstellung der Excel-DateiLiest dann Datenbank 1. Die Datenbank enthält 80 KB ZeilenWenn für jede Zeile eine bestimmte Bedingung erfüllt ist, werden die Datenbanken 2 und 3 gelesenEs speichert es dann in einem Arraylist-Objekt 1000 auf einmal (Ich versuche, Speicherprobleme zu vermeiden, so dass ich es nach Batch speichern)Dann schreibe ich es stapelweise, 1000 auf einmal, um zu übertreffen (dies ist der Teil, den es stoppt)Nachdem es das Lesen und Schreiben abgeschlossen hat, wartet es, bis der Scheduler es erneut aufruft ... Wenn es diesen Schritt erreicht, bin ich ein zufriedener Programmierer =)

Hier sind einige Beobachtungen, die ich gefunden habe;

Das Programm stoppt normalerweise bei der 4. bis 6. Ausführung des Programms (das ist nach 4 oder 6 Stunden ununterbrochener Ausführung des Scheduler-Programms).Es stoppt an einem zufälligen Punkt in Excel wie in der 34.000-er Reihe oder in der 24. oder 15. usw. usw. usw. ...Dieser Fehler tritt nicht auf, wenn ich das Programm ohne einen Scheduler ausführe. Ich konnte es den ganzen Tag manuell ausführen (ich tat es, es war nicht sehr lustig) ohne Fehler.Die Ausgabe-Excel-Datei zeigt 0 Bytes als Größe anWenn ich es zum Beispiel für jede Stunde eingeplant habe und für diese Stunde angehalten habe. Es läuft noch für die folgenden Stunden, stoppt jedoch und stoppt an einem anderen Punkt als beim vorherigen Lauf.

Was könnte dieses Problem verursacht haben. Vielleicht ein Speicherleck oder etwas einfacheres?

zusätzliche Information

Ich habe den Quartz-Scheduler implementiert, indem ich die Klasse des anderen Programms importiert und als Job ausgeführt habe. Hier ist der Code für den Auslöser

JobDetail job = newJob(ExtractorSchedulerJobUtilTester.class)
            .withIdentity("job1", "group1")
            .build();

    CronTrigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(cronSchedule("0 0/2 * 1/1 * ? *"))
            .build();

    Date ft = sched.scheduleJob(job, trigger);
        sched.start();

und die Arbeit

public class ExtractorSchedulerJobUtilTester implements Job {
    public void execute(JobExecutionContext context)
        throws JobExecutionException {
    theProgram program= new theProgram();

    program.main();

    JobKey jobKey = context.getJobDetail().getKey();
    }
}

Ist es möglich dass;

Die Anwendung schöpft mein Gedächtnis aus und stürzt abIch verwende nur eine Instanz von "program" in meinem Quartz-Job, die beim ersten Ausführen des Jobs initialisiert wird, und alle nachfolgenden Ausführungen des Jobs werden von dieser einen Instanz referenziert, wodurch der Speicher voll wird.Es hängt mit der Datenbank (AS400) zusammen (ich bezweifle, dass es stoppt, während es das Excel schreibt).Der Computer wird zu müde und macht eine Pause.

UPDATE - 28.12.2012

Frohes Neues Jahr Jungs / Mädels !!

Es tut mir leid, dass ich einige Zeit gebraucht habe, um mich wieder damit zu beschäftigen. (Warum sollte ich Zeit damit verschwenden, wenn die Welt am 21. untergeht? Es war bittersüß, als es nicht geschah.)

Ich habe mein Programm mit NetBeans Profiler profiliert und mit dem Memory Analyzer die folgenden Zahlen erhalten

Im ersten Diagramm habe ich festgestellt, dass mein Programm für jede Iteration etwa 75 MB Heap-Größe verbraucht (was durch den rosafarbenen Farbton angezeigt wird). Bedeutet dies, dass der verbrauchte Speicher des Programms pro Iteration um 75 MB ansteigt? Was nach einigen Iterationen so viel Speicher verbraucht, dass die Ausführung des Programms beeinträchtigt wird. Ich versuche gerade, einen Heap-Dump zu machen. Ich werde ihn veröffentlichen, sobald es mir gelingt, ihn zum Laufen zu bringen.

Zusätzliche Informationen: Ich habe versucht, den Profiler nur bei laufendem Quartz zu verwenden (löst nichts aus), und die Systemnutzung ist relativ gering und die Größe nimmt nicht mit jeder Iteration zu.

Ich habe es endlich geschafft, einen Haufen Müll zu bekommen. Ich habe 2 Dumps gemacht. Das erste war, als die erste Iteration stattfand, und das zweite war die nächste Iteration. Ich bemerkte, dass es einen großen Unterschied zwischen den Instanzen von zwei meiner Klasse gibt, wie unten angegeben

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage