IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

BIRT Discussion :

ça rame, et je galère (temps chargement Platform, data source classe)


Sujet :

BIRT

  1. #1
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut ça rame, et je galère (temps chargement Platform, data source classe)
    Salut, je découvre BIRT, mais je trouve l'aide et les quelques tutoriaux trouvés sur internet pas assez poussés

    Première chose, grâce à l'exemple de servlet j'ai réussi à afficher un état de test fourni sur le site de BIRT : SalesInvoice.rptdesign

    Je sais que je n'a pas une machine hyper puissante (P4 1,6 GHz, 768 Mo de RAM) mais quand même...
    • Platform.startup et la création de l'objet IReportEngine, ça prend 20 secondes !
    • La première génération après chaque redémarrage de la platform (arrêt/démarre avec mon tomcat) de l'état met 1 minute !

    Au deuxième lancement de l'état et suivants, ça met 3 à 4 secondes.
    Le format HTML ou PDF, c'est kif kif

    Ces temps me paraissent extrêmement longs, surtout que mon chef veut que les pages s'affichent en 1 seconde

    J'ai déjà utilisé JasperReports et j'ai des temps de réponse très rapide (les états qui rament, c'est que mes données sont longues à calculer).

    Constatez-vous le même genre de lenteurs avec BIRT ?

    Autre chose, je veux utiliser des classes Java déjà faite (y'aurait plus qu'à les adapter à l'interface de BIRT, mais laquelle ?), et je vois dans les tutos qu'il faut une DataSource de type script, et qu'on peut utiliser une classe Java au lieu du javascript, mais je n'ai pas trouvé de tutos expliquant comment et avec des exemples !
    Tout retour d'expérience à ce sujet me serait d'un grand intérêt, parce que là, franchement, je galère.

  2. #2
    Membre expert
    Avatar de moritan
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2005
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juin 2005
    Messages : 687
    Points : 3 135
    Points
    3 135
    Par défaut
    Citation Envoyé par iubito
    Salut, je découvre BIRT, mais je trouve l'aide et les quelques tutoriaux trouvés sur internet pas assez poussés

    Première chose, grâce à l'exemple de servlet j'ai réussi à afficher un état de test fourni sur le site de BIRT : SalesInvoice.rptdesign

    Je sais que je n'a pas une machine hyper puissante (P4 1,6 GHz, 768 Mo de RAM) mais quand même...
    • Platform.startup et la création de l'objet IReportEngine, ça prend 20 secondes !
    • La première génération après chaque redémarrage de la platform (arrêt/démarre avec mon tomcat) de l'état met 1 minute !

    Au deuxième lancement de l'état et suivants, ça met 3 à 4 secondes.
    Le format HTML ou PDF, c'est kif kif

    Ces temps me paraissent extrêmement longs, surtout que mon chef veut que les pages s'affichent en 1 seconde

    J'ai déjà utilisé JasperReports et j'ai des temps de réponse très rapide (les états qui rament, c'est que mes données sont longues à calculer).

    Constatez-vous le même genre de lenteurs avec BIRT ?

    Autre chose, je veux utiliser des classes Java déjà faite (y'aurait plus qu'à les adapter à l'interface de BIRT, mais laquelle ?), et je vois dans les tutos qu'il faut une DataSource de type script, et qu'on peut utiliser une classe Java au lieu du javascript, mais je n'ai pas trouvé de tutos expliquant comment et avec des exemples !
    Tout retour d'expérience à ce sujet me serait d'un grand intérêt, parce que là, franchement, je galère.
    Le moteur de Birt nécessite d'être initialisé c'est pour ça que le premier rapport est long.

    Pour la datasource c'est possible mais j'ai pas d'exemple concret à te donner, désolé.

  3. #3
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Ce qui m'inquiète le plus, c'est que ça met 1 minute pour la première génération de l'état après démarrage du serveur. Alors est-ce l'état SalesInvoice de démo qui est lent, ou est-ce le fonctionnement de BIRT, mais si les premiers utilisateurs qui visualisent les états doivent attendre 1 minute... ça ne fait pas très sérieux (surtout si c'est un client sur un extranet )

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    117
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 117
    Points : 95
    Points
    95
    Par défaut
    Je pense que tu peux mettre un thread au demarrage du tomcat qui va initialiser l'engine de BIRT et tu pourra à tout moment l'appelé dans tes servlets...
    Sinon peux tu detaillais ton idées de réutiliser du code existant que veux tu faire ?
    je debute aussi dans Birt donc vas y

  5. #5
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Salut !

    Personnellement j'ai résolu le problème principal de lenteur qui est en effet dû au démarrage du serveur. Il faudrait que tu crées un singleton qui isole le moteur (engine) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    import java.util.ArrayList;
    import java.util.Locale;
     
    import org.eclipse.birt.report.engine.api.EngineConfig;
    import org.eclipse.birt.report.engine.api.EngineException;
    import org.eclipse.birt.report.engine.api.IReportRunnable;
    import org.eclipse.birt.report.engine.api.IRunAndRenderTask;
    import org.eclipse.birt.report.engine.api.RenderOptionBase;
    import org.eclipse.birt.report.engine.api.ReportEngine;
     
    public class EditionPDF {
     
    	private static EditionPDF m_Instance = null;
    	private ReportEngine engine;
    	private String realPath;
    	private RenderOptionBase option;
    	private String etat;
    	private String chemin;
    	private ArrayList parametres;
     
    	private EditionPDF()
    	{
    		EngineConfig config = new EngineConfig();
    		realPath = "C:/Jakarta/webapps/TestBIRT/";
    		config.setResourcePath(realPath+"/WEB-INF/classes/ressources/");
    		config.setEngineHome(realPath+"/WEB-INF/ReportEngine");	//endroit où se trouvent les librairies du Runtime
    		engine = new ReportEngine(config);		//engine permet de connaitre et de modifie le fichier .rptdesign
    		option = new RenderOptionBase();
    		option.setOutputFormat(RenderOptionBase.OUTPUT_FORMAT_PDF);	//Format du fichier de sortie
    	}
     
    	public static EditionPDF getInstance()
    	{
    		if (m_Instance == null)
    			m_Instance = new EditionPDF();
    		return m_Instance;
    	}
     
    	public void init(String etat, String chemin, ArrayList parametres)
    	{
    		this.etat = etat;
    		this.chemin = chemin;
    		this.parametres = parametres;
    	}
     
    	public void run()
    	{
    		try
    		{
    			IReportRunnable design = engine.openReportDesign(realPath+"/WEB-INF/etats/"+etat+".rptdesign");
    			IRunAndRenderTask task = engine.createRunAndRenderTask(design);		//Crée une tâche afin d'éxécuter le rapport
    			task.setParameterValue("chemin",realPath);
    			for (int i=0;i<parametres.size();i++)
    			{
    				ParametreEditionPDF param = (ParametreEditionPDF)parametres.get(i);
    				task.setParameterValue(param.getCle(),param.getValeur());
    			}
    			task.setParameterValue("realPath", realPath);
    			/* Création PDF */
    			option.setOutputFileName(chemin);	//Nom du fichier de sortie
    			task.setRenderOption(option);		//Chargement du fichier
    			/* Fin création PDF */
    			task.run();							//Création du fichier
    		}
    		catch (EngineException e)
    		{
    			System.out.println(e.getMessage());
    		}
    	}
     
    	public void destructeur()
    	{
    		engine.destroy();
    	}
    }
    Sachant que ParametreEdition ressemble à un Bean :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public class ParametreEditionPDF {
    	private String cle;
    	private Object valeur;
     
    	public ParametreEditionPDF(String cle, Object valeur)
    	{
    		this.cle = cle;
    		this.valeur = valeur;
    	}
     
    	public String getCle() {
    		return cle;
    	}
     
    	public Object getValeur() {
    		return valeur;
    	}
    }
    La première classe te permets de créer le moteur que tu réutiliseras et de l'initialiser ainsi que de le lancer. La deuxième classe te permet de passer des paramètres à ton rptDesign de façon propre.

    Je te donne un exemple d'utilisation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    List parametres = new ArrayList();
    parametres.add(new ParametreEditionPDF("personnes",lesPersonnes);
    parametres.add(new ParametreEditionPDF("structures",lesStructures);
    EditionPDF edition = EditionPDF.getInstance();
    edition.init("MonRapport", "MonRapport.pdf", (ArrayList)parametres);
    edition.run();
    Ce code crée la liste des paramètres à passer au rptdesign puis récupère l'instance en cours de l'engine. Si l'instance n'est pas lancée, il le fait (donc premier lancement plus long). Ensuite, il initialise les options principales :
    - Nom du rptdesign
    - Nom du fichier de sortie
    - Liste des paramètres
    Enfin, l'édition est lancée.

  6. #6
    Membre régulier
    Profil pro
    Développeur Java
    Inscrit en
    Juillet 2004
    Messages
    204
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2004
    Messages : 204
    Points : 103
    Points
    103
    Par défaut
    Oui j'ai aussi fait un singleton pour l'engine

  7. #7
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Pour le singleton, je l'ai fait un peu de cette manière, mais dans une servlet.

    moritan, (et les autres aussi), avez-vous vu un exemple de DataSource en java ?

    je donne un exemple fictif.
    une classe CompteBancaire qui contient plusieurs fonctions qui retournent des "lignes" d'opérations réalisées sur le compte. (collection de LigneOperation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public class CompteBancaire {
     
      public CompteBancaire(String numCompte) {
        this.numCompte = numCompte;
      }
     
      /**
       * Retourne les opérations effectuées entre debut et fin
       * @return Collection de LigneOperation
       */
      public Collection getOperations(Date debut, Date fin) {
        Collection ret = getToutesLesOperations();
        Iterator it = ret.iterator();
        while (it.hasNext()) {
          LigneOperation lo = (LigneOperation) it.next();
          if (lo.getDate().before(debut) || lo.getDate().after(fin))
            it.remove();
        }
        return ret;
      }
    }
    LigneOperation :
    - getDate, getLibelle, getDebit, getCredit

    et là avec JasperReport je faisais une classe datasource qui implémente JrDataSource avec un constructeur prenant en paramètre ma collection, une méthode next() qui passe à la ligne suivante, et getFieldValue qui retourne la valeur demandée pour un champ, du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    /** DataSource sur des opérations d'un compte bancaire */
    public class OperationsDataSource implements JrDataSource {
     
      private Iterator itOperations;
      private LigneOperation current; // Ligne en cours d'affichage
      public OperationsDataSource(Collection c) {
        this.itOperations = c.iterator();
      }
     
      //Ici la méthode appelée par JR pour savoir s'il existe encore une ligne à afficher
      public boolean next() {
        boolean ret = itOperations.hasNext();
        if (ret)
          current = (LigneOperation) itOperations.next();
        return ret;
      }
     
      //Ici la méthode appelée par JR pour demander une valeur d'une zone
      public Object getFieldValue(String nomDuChamp) {
        if( nomDuChamp.equals("date"))
          return current.getDate();
        else if (nomDuChamp.equals("libelle"))
          return current.getLibelle();
        //...débit...crédit
      }
    }
    Sur un écran je peux demander les dates souhaitées, et fournir le PDF en utilisant la datasource suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DataSource ds = new OperationsDataSource(
      new CompteBancaire("0123456")
        .getOperations(1er janvier 2007, 10 janvier 2007)
    );
    Ici c'est un exemple très simple avec un filtrage tout bête sur des dates, mais mes cas réels sont un tantinet plus compliqués..., mes infos sont affichées ne sont pas forcément toutes tirées d'une base de données, elles peuvent être calculées de manière complexe.

    Je cherche donc ZE solution pour créer une data source en java pur, ou un minimum de code javascript, mais auquel je passe des collections d'objets bean triés, filtrés...

    Merci d'avance

  8. #8
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Comme tu l'as vu dans des sujets différents, on peut passer un DataSource en paramètre, donc le fait de créer un DataSource en Java, tu as l'air de les avoir déjà, il ne reste plus qu'à le passer.

    Tu n'auras, en principe, pas à refaire tes objets.

  9. #9
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Merci, j'suis en train de lire tout le forum pour trouver l'exemple... Si tu en as un en tête, je crois que j'ai vu un sujet mais où ça ne marche pas.

    /me retourne lire tout le forum...

  10. #10
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    http://www.developpez.net/forums/sho...d.php?t=262247

    Il n'y a pas d'exemples complets mais tu as des pistes au moins

  11. #11
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    Je suis justement tombé sur ce topic, mais j'arrive pas à trouver la doc de task.setDataSource(...) et le seul exemple fait juste une modification de la requête SQL.

  12. #12
    BiM
    BiM est déconnecté
    Expert éminent sénior
    Avatar de BiM
    Femme Profil pro
    Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT
    Inscrit en
    Janvier 2005
    Messages
    7 796
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultante/Formatrice BIRT & Ingénieur Java/J2EE/GWT

    Informations forums :
    Inscription : Janvier 2005
    Messages : 7 796
    Points : 10 765
    Points
    10 765
    Par défaut
    Citation Envoyé par iubito
    Je suis justement tombé sur ce topic, mais j'arrive pas à trouver la doc de task.setDataSource(...) et le seul exemple fait juste une modification de la requête SQL.
    C'est parce que la doc sur cette méthode n'existe pas.

    Je pense que tu devrais poser la question sur le newsgroup (en anglais bien sûr) et si tu obtiens la réponse, de la poster ici

  13. #13
    Membre éclairé
    Avatar de iubito
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    Par défaut
    D'après les sources, le setDataSource attend une archive, un report en quelque sorte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public void setDataSource( IDocArchiveReader dataSource )
    {
    	// try to open the dataSource as report document
    	try
    	{
    		ReportDocumentReader document = new ReportDocumentReader( engine,
    			dataSource );
    		Map values = document.getParameterValues( );
    		Map texts = document.getParameterDisplayTexts( );
    		setParameterValues( values );
    		setParameterDisplayTexts( texts );
    		document.close( );
    	}
    	catch ( EngineException ex )
    	{
    		log.log( Level.WARNING,
    			"failed to load the paremters in the data source", ex );
    	}
     
    	executionContext.setDataSource( dataSource );		
    }
    J'ai commencé à regarder la piste suggérée par le code ici, mais là je met ce projet en stand by, y'a plus urgent, j'y reviendrai plus tard

Discussions similaires

  1. Temps chargement page formulaire
    Par gidebo dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 05/07/2010, 09h34
  2. temps accès et temps chargement site web
    Par butterfly86 dans le forum Développement Web en Java
    Réponses: 1
    Dernier message: 17/02/2010, 08h49
  3. Différence temps chargement KML IE7 / IE8
    Par Unusual dans le forum IGN API Géoportail
    Réponses: 2
    Dernier message: 05/11/2009, 22h43
  4. Temps chargement d'une page
    Par zaineb.z dans le forum ASP.NET
    Réponses: 3
    Dernier message: 03/03/2009, 10h27
  5. PC qui rame apres un certain temps
    Par sovo dans le forum Ordinateurs
    Réponses: 9
    Dernier message: 26/07/2006, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo