2016-05-11 21 views
0

こんにちは私はJasperReportの新機能です。大きなレポートを生成しようとしています。私のレポートには多くのサブレポートがありますが、 1048、例外が発生します。私のレポートを生成するためにVirtualizacionを使用し、私のコンピュータにPDFファイルをエクスポートしています。ここ は例外である:JRSwapVirtualizationを用いJasperReport-仮想化コンテキストのロック中に中断されました

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
イム、コードの次の部分に示されているように:

マイレポート(パッケージ)4つのサブレポート(それらの2持つから成り1ページのみ、もう1ページは1つ以上の場合があります)、この4つのサブレポートから1つの特定の通りのパッケージを生成します。たとえば、 "ST。Julia AV"には984人の人がいて、このアプリは通りにいるすべての人のためのパッケージを生成します。この金額はすべて正しくありますが、人々がレポートエクスポートのクラッシュを増やすと、 WEBAPPに取り組ん

詳細
イムは、Glassfishのを使用して、私は、サーバー用のJVMに3GBのRAMを割り当てます。

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(); 
    } 

答えて

1

これは、仮想化を初期化する方法と使用する仮想化の種類に大きく依存します。

たとえば、非常に高いページ設定のJRFileVirtualizerを使用すると、次のようになります。

JRFileVirtualizer virtualizer = new JRFileVirtualizer(100, "myDir"); 

コンテンツはファイルに書き込まれます。この値を非常に低い値に設定して作業を進めてください。

JRFileVirtualizer virtualizer = new JRFileVirtualizer(1, "myDir"); 

編集:

あなたJRSwapFileの初期化を見た後、ブロックサイズの値は非常に小さいように見えます。あなたは結果に満足しているし、何の問題が発生しなくなるまであなたは、例えば、仮想化で開催されたページをステップアップする必要があり、ことをやったとき

new JRSwapFile(System.getProperty("java.io.tmpdir"), 2048, 32);

次の例のようなものを試してみてください

virtualizer = new JRSwapFileVirtualizer(5, swapFile, true);

あるいは

virtualizer = new JRSwapFileVirtualizer(100, swapFile, true);

+0

[OK]を、どのように仮想化を初期化しますか?コード行はどのように見えますか?あなたが与えるより多くの文脈? – tobi6

+0

Imはすでに質問を更新しています。 JasperReportの新機能@ tobi6 –

+0

問題ありません。 JRSwapFileの初期化は非常に小さく見えますが、[この回答の中の]サイズ(http://stackoverflow.com/a/2341356/5191221)ははるかに大きくなります。 '新しいJRSwapFile(System.getProperty(" java.io.tmpdir ")、2048、32);'を試してください。それが動作すれば、 'new JRSwapFileVirtualizer(5、swapFile、true);'でページの値を上げることができます。 – tobi6

関連する問題