Bonjour,
D'abord, je me presente, je suis stagiaire dans un centre de recherche, et l'on me demande de developper un module d'edition de rapport. Ce module d'edition est a integrer dans une application Eclipse RCP. Rien de bien complique grâce a Jasper.
Mais la, je suis face a un vrai probleme, lorsque j'avais fini de developper le module d'edition, tout fonctionnait parfaitement. J'ai ensuite continuer sur d'autres parties du projet (non concerne ici). Quand j'ai essaye de faire de nouveau tests, je me suis retrouve avec une OutOfMemoryError inexplicable. J'ai essaye plein de choses differentes pour revenir en arriere mais je n'ai vraiment aucune idee de la maniere de proceder. Je vais essayer de vous detailler les elements pertinents que j'ai tente (je ne vous parlerai pas des priere ou autre rite vaudoo).
D'abord le rapport est compose de resultats d'un outil de calcul. L'objet contenant les resultats est envoye a une factory de JavaBean elementaires permettant de rajouter du contenu textuelle aux resultats sans surcharger inutilement la classe de calcul. Au rapport principal s'ajoute uniquement deux sous-rapports directs (tous deux tres simples).
D'apres les traces generes (voir plus bas), le probleme vient de JFreeChart qui n'arrive pas a creer de nouveaux Thread. Mais même en jouant sur la configuration de l'application, ce probleme n'est pas resolut. J'ai biensur essayer de commenter la creation des graphiques, ce qui me permet de genere un rapport sans encombre. Mais j'ai besoin de ses graphiques. Je les ai donc remis en tant que parametres et ô grande surprise l'erreur ne vient plus des graphiques mais du "fillReport".
J'ai ensuite essaye de recreer un rapport depuis zero et pas a pas, j'ai teste. De cette maniere, j'ai reussi a generer des rapports avec des graphique sans aucun soucis. Mais des que j'ajoute un sous rapport (même compose de texte static), le probleme revient et ne disparait pas avec la suppression du sous-rapport.
Je suis perdu et je commence a perdre espoire. j'y ai passer plusieurs jours et une des dernieres idees et de changer d'ordinnateur.
Stack trace genere :
La PDF Factory
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 java.lang.OutOfMemoryError: unable to create new native thread at java.lang.Thread.start0(Native Method) at java.lang.Thread.start(Unknown Source) at sun.awt.windows.WToolkit.<init>(Unknown Source) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source) at java.lang.reflect.Constructor.newInstance(Unknown Source) at java.lang.Class.newInstance0(Unknown Source) at java.lang.Class.newInstance(Unknown Source) at java.awt.Toolkit$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.awt.Toolkit.getDefaultToolkit(Unknown Source) at javax.swing.UIManager.<clinit>(Unknown Source) at org.jfree.chart.JFreeChart.<clinit>(JFreeChart.java:261) at org.jfree.chart.ChartFactory.createScatterPlot(ChartFactory.java:1513) at ics.eaat.jasper.reporting.chart.DSMChart.createChart(DSMChart.java:61) at ics.eaat.jasper.reporting.chart.DSMChart.createDirectDependencyMatrix(DSMChart.java:36) at ics.eaat.jasper.reporting.report.BeanDSM.<init>(BeanDSM.java:25) at ics.eaat.jasper.reporting.report.DataSourceFactory.dataSourceDSMAnalyze(DataSourceFactory.java:24) at ics.eaat.jasper.reporting.report.PdfFactory.generateDSMReport(PdfFactory.java:36) at ics.eaat.concretemodeller.controller.Controller.calculateDSM(Controller.java:2042) at ics.eaat.concretemodeller.main.handlers.CalculateDSMCommandHandler.execute(CalculateDSMCommandHandler.java:27) at org.eclipse.ui.internal.handlers.HandlerProxy.execute(HandlerProxy.java:293) at org.eclipse.core.commands.Command.executeWithChecks(Command.java:476) at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508) at org.eclipse.ui.internal.handlers.HandlerService.executeCommand(HandlerService.java:169) at org.eclipse.ui.internal.handlers.SlaveHandlerService.executeCommand(SlaveHandlerService.java:241) at org.eclipse.ui.menus.CommandContributionItem.handleWidgetSelection(CommandContributionItem.java:829) at org.eclipse.ui.menus.CommandContributionItem.access$19(CommandContributionItem.java:815) at org.eclipse.ui.menus.CommandContributionItem$5.handleEvent(CommandContributionItem.java:805) at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84) at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053) at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165) at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754) at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2701) at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2665) at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2499) at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:679) at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332) at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:668) at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149) at ics.eaat.concretemodeller.main.Application.start(Application.java:20) at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:110) at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:79) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:344) at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:179) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:622) at org.eclipse.equinox.launcher.Main.basicRun(Main.java:577) at org.eclipse.equinox.launcher.Main.run(Main.java:1410) at org.eclipse.equinox.launcher.Main.main(Main.java:1386)
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 public class PdfFactory { public static void generateDSMReport(DSM dsm, String outputDirectory){ Map<String, Object> parameters = new HashMap<String, Object>(); parameters.put("inputMatrix", DSMChart.createDirectDependencyMatrix(dsm.getListOfElement())); parameters.put("rearrangedMatrix", DSMChart.createRearrangedMatrix(dsm.getListOfElement())); // generatePdfReport("DSMReport", parameters, DataSourceFactory.dataSourceDSMAnalyze(dsm), outputDirectory); generatePdfReport("test", parameters, DataSourceFactory.dataSourceDSMAnalyze(dsm), outputDirectory); } @SuppressWarnings("rawtypes") private static void generatePdfReport (String templateName, Map<String, Object> parameters, Collection data, String outputName){ JasperPrint jasperPrint = null; try { jasperPrint = JasperFillManager.fillReport(findAbsolutePath("/template/" + templateName + ".jasper"), parameters, new JRBeanCollectionDataSource(data)); } catch (JRException e) { Status status1= new Status(IStatus.ERROR, PLUGIN_ID, "Impossible to fill the template"); StatusManager.getManager().handle(status1, StatusManager.LOG); return; } try { JasperExportManager.exportReportToPdfFile(jasperPrint, outputName); } catch (JRException e) { Status status1= new Status(IStatus.ERROR, PLUGIN_ID, "Impossible to generate the report, the PDF might be already open."); StatusManager.getManager().handle(status1, StatusManager.LOG); return; } } }
Partager