Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Archived » BIRT » big speed difference eclipse/ external jar - Platform.startup(config) / task.run() very slow(report generating: eclipse 10 sec / external jar 441 sec)
big speed difference eclipse/ external jar - Platform.startup(config) / task.run() very slow [message #1710783] Fri, 09 October 2015 10:00 Go to next message
dome G. is currently offline dome G.Friend
Messages: 4
Registered: May 2014
Junior Member
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:

  1. Platform.startup(config)
  2. 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.

  • Attachment: Converter.java
    (Size: 13.90KB, Downloaded 132 times)
  • Attachment: Main.java
    (Size: 1.82KB, Downloaded 84 times)
Re: big speed difference eclipse/ external jar - Platform.startup(config) / task.run() very slow [message #1712563 is a reply to message #1710783] Mon, 26 October 2015 13:10 Go to previous message
dome G. is currently offline dome G.Friend
Messages: 4
Registered: May 2014
Junior Member
Hi everyone,

no ideas? Do you need some more information?
Previous Topic:Integrating D3.js in Birt
Next Topic:mechanism to show or hide layers in BIRT
Goto Forum:
  


Current Time: Thu Apr 25 14:20:52 GMT 2024

Powered by FUDForum. Page generated in 0.03490 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top