Hello I'm new on JasperReport and I'm trying to generate a large report.My report has a lot of subreport, but with 968 records generate all correctly but when the recors are more than 1048, the exception come up. Im using Virtualizacion for the generation of my Report and im exporting the PDF File to my computer. Here is the Exception:
Grave: net.sf.jasperreports.engine.JRRuntimeException: Interrupted while locking virtualization context
at net.sf.jasperreports.engine.fill.JRVirtualizationContext.lock(JRVirtualizationContext.java:524)
at net.sf.jasperreports.engine.base.ElementsBlock.lockContext(VirtualizableElementList.java:237)
at net.sf.jasperreports.engine.base.ElementsBlock.afterExternalization(VirtualizableElementList.java:517)
at net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer.virtualizeData(JRAbstractLRUVirtualizer.java:590)
at net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer.evict(JRAbstractLRUVirtualizer.java:402)
at net.sf.jasperreports.engine.fill.JRAbstractLRUVirtualizer.requestData(JRAbstractLRUVirtualizer.java:548)
at net.sf.jasperreports.engine.base.ElementsBlock.ensureData(VirtualizableElementList.java:463)
at net.sf.jasperreports.engine.base.ElementsBlock.ensureDataAndTouch(VirtualizableElementList.java:432)
at net.sf.jasperreports.engine.base.ElementsBlock.writeObject(VirtualizableElementList.java:582)
at sun.reflect.GeneratedMethodAccessor384.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at net.sf.jasperreports.engine.base.JRVirtualPrintPage.writeObject(JRVirtualPrintPage.java:274)
at sun.reflect.GeneratedMethodAccessor383.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at java.util.ArrayList.writeObject(ArrayList.java:762)
at sun.reflect.GeneratedMethodAccessor257.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.defaultWriteObject(ObjectOutputStream.java:441)
at java.util.Collections$SynchronizedCollection.writeObject(Collections.java:2081)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:1028)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1548)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1509)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1432)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1178)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:348)
at net.sf.jasperreports.engine.util.JRSaver.saveObject(JRSaver.java:75)
at net.sf.jasperreports.engine.util.JRSaver.saveObject(JRSaver.java:55)
at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:230)
at net.sf.jasperreports.engine.JasperFillManager.fillToFile(JasperFillManager.java:124)
at net.sf.jasperreports.engine.JasperFillManager.fillReportToFile(JasperFillManager.java:666)
Caused by: java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireInterruptibly(AbstractQueuedSynchronizer.java:1220)
at java.util.concurrent.locks.ReentrantLock.lockInterruptibly(ReentrantLock.java:335)
at net.sf.jasperreports.engine.fill.JRVirtualizationContext.lock(JRVirtualizationContext.java:520)
... 94 more
UPDATE
Im using JRSwapVirtualization, like is showed in the next piece of code:
My Report(Package) consist of 4 subreports (2 of them has only one page, and the other may have one or more), the requeriment is to generate a package from this 4 subreports per person in a specific street. For example, "ST. Julia AV" has 984 people and the app generate a package for every person in the street. with this amount all is correctly but when the people increase the report export crash.
DETAIL
Im working on a WEBAPP, using Glassfish, i assigned 3GB of RAM to the JVM for the Server.
try {
cn = dataSourceReports.getConnection();
JRSwapFile swapFile = new JRSwapFile(System.getProperty("java.io.tmpdir"), 30, 10);
virtualizer = new JRSwapFileVirtualizer(1, swapFile, true);
parameters.put(JRParameter.REPORT_VIRTUALIZER,virtualizer);
JasperPrint jp = JasperFillManager.fillReport(ROUTE_REPORT,parameters, cn);
JasperExportManager.exportReportToPdfFile(jp,
"D://placePackage.pdf");
cn.close();
} catch (SQLException e) {
e.printStackTrace();
}finally{
virtualizer.cleanup();
}
This depends strongly on how you initialize the virtualization and what kind of virtualization you use.
For example, if you use the JRFileVirtualizer with a very high page setting, e.g.
JRFileVirtualizer virtualizer = new JRFileVirtualizer(100, "myDir");
only every 100 pages the contents is written to the file. It might help to set this value down to a very low one and work your way up.
JRFileVirtualizer virtualizer = new JRFileVirtualizer(1, "myDir");
Edit:
After seeing the initialization of your JRSwapFile, the values for the block size seem very small. Try something like the following example:
new JRSwapFile(System.getProperty("java.io.tmpdir"), 2048, 32);
When you've done that, you should step up the pages held in the virtualizer until you are satisfied with the result and no problems occur, e.g.
virtualizer = new JRSwapFileVirtualizer(5, swapFile, true);
or even
virtualizer = new JRSwapFileVirtualizer(100, swapFile, true);