Hi all,
i have a problem with the generation time.
If the programm is execute in eclipse the generating of the reports works fine with about 10 seconds.
When i use the runable jar wich is called by console statement :
java -jar [path] [conig_path]
(second is a parameter to load the configfile) - the same program needs over 400 seconds.
After runtime debug saw that there are two bottlenecks:
- Platform.startup(config)
- task.run()
(both marked in the source code)
I am using mySQL Community Server (GPL) in version: 5.6.26
Here is my source code(files also added as attachments, but only converter.java is listed here. main.java you can pick up from attachements).
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.net.URL;
import java.text.MessageFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.eclipse.birt.core.exception.BirtException;
import org.eclipse.birt.core.framework.Platform;
import org.eclipse.birt.report.data.adapter.api.timeFunction.DateTimeUtility;
import org.eclipse.birt.report.engine.api.EngineConfig;
import org.eclipse.birt.report.engine.api.EngineException;
import org.eclipse.birt.report.engine.api.HTMLRenderOption;
import org.eclipse.birt.report.engine.api.IReportEngine;
import org.eclipse.birt.report.engine.api.IReportEngineFactory;
import org.eclipse.birt.report.engine.api.IReportRunnable;
import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
import org.eclipse.birt.report.engine.api.PDFRenderOption;
import com.mysql.jdbc.PreparedStatement;
import com.mysql.jdbc.Statement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.print.attribute.standard.DateTimeAtCompleted;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.w3c.dom.Node;
import org.w3c.dom.Element;
import java.io.File;
@SuppressWarnings("unused")
public class Converter
{
int Anzahl_Reports = 0;
private boolean bericht_wurder_erstellt;
private String reportpath = "";
private String birt_report_engine_path = "";
private String logfilepath = "";
private String rptdesignpath = "";
private String logstring = "";
private String zeitmessung_log = "";
// absoluter Pfad zu config_rc.xml
private String config_rc_pfad = "";
// Ermittelt den Zeilenumbruch (Windows/Mac/Linux)
final static String lineSeparator = System.getProperty("line.separator");
public Converter(String[] parameter)
{
this.config_rc_pfad = parameter[0];
}
public Converter()
{
}
public void executeReport() throws BirtException, SQLException
{
long timestart;
long timeend;
// Datenbank
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet generatedKeys = null;
// DB Einstellungen
String user = "root";
String pw = "";
// Name des Reports
String name_Report = "";
// Anzahl Datensätze ermitteln
// ermittelt die Anzahl der zu erstellenden Reports
String sql = "select count(*) from rc_reports";
System.out.println("Erfasse Reports...");
zeitmessung_log += "Erfasse Reports..." + lineSeparator;
timestart = System.currentTimeMillis();
System.out.println("Verbindungsaufbau...");
zeitmessung_log += "Verbindungsaufbau..." + lineSeparator;
boolean bericht_wurder_erstellt = false;
Statement st = null;
ResultSet rs = null;
connection = DriverManager.getConnection("jdbc:mysql://localhost/gp8" + "?user=" + user + "&password=" + pw);
st = (Statement) connection.createStatement();
rs = st.executeQuery(sql);
rs.next();
Anzahl_Reports = (st.getResultSet().getInt(1));
System.out.println("Ermittelte Reports:" + Anzahl_Reports);
zeitmessung_log += "Ermittelte Reports:" + Anzahl_Reports + "" + lineSeparator;
st.close();
rs.close();
timeend = System.currentTimeMillis();
System.out.println("Verbindungsaufbau beendet. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "Verbindungsaufbau beendet. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
// Report
IReportEngine engine = null;
EngineConfig config = null;
// Birt Einstellungen
config = new EngineConfig();
config.setBIRTHome(birt_report_engine_path);
config.setLogConfig(logfilepath.replace("\n", "").replace("\t", ""), Level.OFF);
System.out.println("Birt Einstellungen geladen");
zeitmessung_log += "Birt Einstellungen geladen" + lineSeparator;
System.out.println("Starte Startup...");
zeitmessung_log += "Starte Startup..." + lineSeparator;
timestart = System.currentTimeMillis();
Platform.startup(config);
timeend = System.currentTimeMillis();
System.out.println("Startup beendet. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "Startup beendet. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
System.out.println("Starte Factory...");
zeitmessung_log += "Starte Factory..." + lineSeparator;
timestart = System.currentTimeMillis();
IReportEngineFactory factory = (IReportEngineFactory) Platform
.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);
timeend = System.currentTimeMillis();
System.out.println("Factory erstellt. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "Factory erstellt. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
System.out.println("Starte Engine...");
zeitmessung_log += "Starte Engine..." + lineSeparator;
timestart = System.currentTimeMillis();
engine = factory.createReportEngine(config);
timeend = System.currentTimeMillis();
System.out.println("Engine geladen. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "Engine geladen. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
// So viele Reports erstellen wie in der Tabelle (rc_reports)
// angefordert
for (int i = 0; i < Anzahl_Reports; i++)
{
try
{
System.out.println("Lade Bericht...");
zeitmessung_log += "Lade Bericht..." + lineSeparator;
timestart = System.currentTimeMillis();
sql = "select Reportname from rc_reports ";
st = (Statement) connection.createStatement();
rs = st.executeQuery(sql);
rs.next();
// Reportname ermitteln
name_Report = (st.getResultSet().getString(1));
st.close();
rs.close();
timeend = System.currentTimeMillis();
System.out.println("Bericht geladen. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "Bericht geladen. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
System.out.print("Erstelle Bericht Nr." + (i + 1) + ": " + "\"" + name_Report + "\"" + lineSeparator);
zeitmessung_log += "Erstelle Bericht Nr." + (i + 1) + ": " + "\"" + name_Report + "\"" + lineSeparator;
try
{
// XML-Datei laden
File fXmlFile;
// Wenn Übergabeparameter leer sind
if (config_rc_pfad.equals(""))
{
System.out.println("Lade Config XML aus Programmordner...");
zeitmessung_log += "Lade Config XML aus Programmordner..." + lineSeparator;
fXmlFile = new File("config_rc.xml");
} else
{
fXmlFile = new File(config_rc_pfad);
System.out.println("Lade Config XML aus Programmübergabeparameter...");
zeitmessung_log += "Lade Config XML aus Programmübergabeparameter..." + lineSeparator;
}
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
doc.getDocumentElement().normalize();
// zu Tag springen
NodeList nList = doc.getElementsByTagName("reportpath");
// Zum ersten Eintrag (es gibt nur einen) springen
Node nNode = nList.item(0);
// Wert holen
reportpath = nNode.getTextContent();
// zu Tag springen
nList = doc.getElementsByTagName("birt_report_engine_path");
// Zum ersten Eintrag (es gibt nur einen) springen
nNode = nList.item(0);
// Wert holen
birt_report_engine_path = nNode.getTextContent();
// zu Tag springen
nList = doc.getElementsByTagName("logfilepath");
// Zum ersten Eintrag (es gibt nur einen) springen
nNode = nList.item(0);
// Wert holen
logfilepath = nNode.getTextContent();
// zu Tag springen
nList = doc.getElementsByTagName("rptdesignpath");
// Zum ersten Eintrag (es gibt nur einen) springen
nNode = nList.item(0);
// Wert holen
rptdesignpath = nNode.getTextContent();
} catch (Exception e)
{
e.printStackTrace();
logstring += lineSeparator + e.getMessage();
}
// Die Reportdatei öffnen
String reportdateipfad = rptdesignpath.replace("\n", "").replace("\t", "") + name_Report + ".rptdesign";
IReportRunnable design = null;
System.out.println("Öffne Reportdatei...");
zeitmessung_log += "Öffne Reportdatei..." + lineSeparator;
design = engine.openReportDesign(reportdateipfad);
System.out.println("Reportdateipfad:" + lineSeparator + reportdateipfad);
zeitmessung_log += "Reportdateipfad:" + lineSeparator +reportdateipfad;
IRunAndRenderTask task = engine.createRunAndRenderTask(design);
// PDF Renderer
PDFRenderOption options = new PDFRenderOption();
// Name des zu erzeugenden Bericht, so wie Erstellungsort (Pfad)
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyymmdd_hhmmss");
String strDate = sdf.format(date);
String outputfile = reportpath;
outputfile = reportpath.replace("\n", "").replace("\t", "") + strDate + "_" + name_Report + "_" + (i + 1) + ".pdf";
System.out.println("Bericht abgelegt in:" + lineSeparator + outputfile);
zeitmessung_log += "Bericht abgelegt in:" + lineSeparator + outputfile + lineSeparator;
options.setOutputFileName(outputfile);
options.setOutputFormat("pdf");
System.out.println("Start setRenderOption...");
zeitmessung_log += "Start setRenderOption..." + lineSeparator;
timestart = System.currentTimeMillis();
task.setRenderOption(options);
timeend = System.currentTimeMillis();
System.out.println("setRenderOption beendet. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "setRenderOption beendet. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
System.out.println("Start RunTask...");
zeitmessung_log += "Starte RunTask...";
timestart = System.currentTimeMillis();
task.run();
timeend = System.currentTimeMillis();
System.out.println("RunTask beendet. (" + (timeend - timestart) / 1000.0 + "s)");
zeitmessung_log += "RunTask beendet. (" + (timeend - timestart) / 1000.0 + "s)" + lineSeparator;
task.close();
// Wenn Datei vorhanden, wird diese geöffnet
if ((new File(reportpath.replace("\n", "").replace("\t", "") + strDate + "_" + name_Report + "_" + (i + 1) + ".pdf"))
.exists())
{
System.out.println("Öffne Bericht...");
zeitmessung_log += "Öffne Bericht..." + lineSeparator;
String pfad = reportpath.replace("\n", "").replace("\t", "") + strDate + "_" + name_Report + "_" + (i + 1) + ".pdf";
Process p = Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + pfad);
p.waitFor();
// Flag auf true setzen, da Bericht erfolgreich generiert
// worden ist
bericht_wurder_erstellt = true;
} else
{
System.out.println("File does not exists");
logstring += lineSeparator + "File does not exists";
}
} catch (Exception ex)
{
ex.printStackTrace();
logstring += lineSeparator + ex.getMessage();
} finally
{
}
}
engine.destroy();
logfilepath = logfilepath.replaceAll("\n", "");
logfilepath = logfilepath.replaceAll("\t", "");
String dirName = logfilepath;
File dir = new File(dirName);
if (dir.isDirectory())
{
// existiert
} else
{
// existiert nicht
dir.mkdir();
}
File logfile;
logfile = new File(logfilepath + "Logfile.txt");
if(!logfile.exists())
{
try
{
logfile.createNewFile();
} catch (IOException e)
{
e.printStackTrace();
}
}
FileWriter writer;
try
{
writer = new FileWriter(logfile.toString().replace("\n\t", ""), true);
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String strDate = sdf.format(date);
if (logstring.equals(""))
{
logstring = strDate + ":" + lineSeparator + "Keine Fehler aufgetreten" + lineSeparator;
writer.write(logstring);
writer.close();
} else
{
writer.write(strDate + ":" + logstring + lineSeparator + lineSeparator);
writer.close();
}
} catch (IOException e)
{
e.printStackTrace();
}
Platform.shutdown();
}
public String get_zeitmessunglog()
{
return this.zeitmessung_log;
}
public String get_logpath()
{
return this.logfilepath;
}
}
And here are the two logfiles with the time measurement:
(sorry, output is in german - but you can see the time differences good)
Starting with eclipse:
2015-10-09 11:20:08:
Keine Fehler aufgetreten
Erfasse Reports...
Verbindungsaufbau...
Ermittelte Reports:1
Verbindungsaufbau beendet. (0.819s)
Birt Einstellungen geladen
Starte Startup...
Startup beendet. (2.276s)
Starte Factory...
Factory erstellt. (0.042s)
Starte Engine...
Engine geladen. (0.318s)
Lade Bericht...
Bericht geladen. (0.001s)
Erstelle Bericht Nr.1: "Buisnessreport01"
Lade Config XML aus Programmordner...
Öffne Reportdatei...
Reportdateipfad:
C:\GP8Projects\Birt\workspace\Reporttool\Buisnessreport01.rptdesignBericht abgelegt in:
C:\01_Daten\Berichte\20152009_112003_Buisnessreport01_1.pdf
Start setRenderOption...
setRenderOption beendet. (0.0s)
Starte RunTask...RunTask beendet. (4.928s)
Öffne Bericht...
Erstellung nach 9.647 Sekunden beendet.
---
Starten as external jar:
2015-10-09 11:18:26:
Keine Fehler aufgetreten
Erfasse Reports...
Verbindungsaufbau...
Ermittelte Reports:1
Verbindungsaufbau beendet. (10.212s)
Birt Einstellungen geladen
Starte Startup...
Startup beendet. (232.101s)
Starte Factory...
Factory erstellt. (6.774s)
Starte Engine...
Engine geladen. (3.311s)
Lade Bericht...
Bericht geladen. (0.001s)
Erstelle Bericht Nr.1: "Buisnessreport01"
Lade Config XML aus Programmübergabeparameter...
Öffne Reportdatei...
Reportdateipfad:
C:\GP8Projects\Birt\workspace\Reporttool\Buisnessreport01.rptdesignBericht abgelegt in:
C:\01_Daten\Berichte\20151509_111547_Buisnessreport01_1.pdf
Start setRenderOption...
setRenderOption beendet. (0.0s)
Starte RunTask...RunTask beendet. (158.698s)
Öffne Bericht...
Erstellung nach 441.228 Sekunden beendet.
---
Maybe some DB issues, but in eclipse / birt all works fine.
I tried without success different mysql-version and different jre-runtime version (1.8_45 and 1.8_60).
Hope someone can help me.