Environment:
- Payara 4.1.1.154 with Hazelcast enabled
- addition in pom.xml:
<dependency> <groupId>javax.cache</groupId> <artifactId>cache-api</artifactId> <version>1.0.0</version> </dependency>
Implementation:
package com.rs.pdfproducer.invoice.control;
import com.rs.pdfproducer.PdfProducerException;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.cache.annotation.CacheDefaults;
import javax.cache.annotation.CacheKey;
import javax.cache.annotation.CacheRemoveAll;
import javax.cache.annotation.CacheResult;
import javax.inject.Singleton;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.Renderable;
import net.sf.jasperreports.engine.util.JRLoader;
import net.sf.jasperreports.renderers.BatikRenderer;
/**
*
* @author realsoft
*/
@Singleton
@CacheDefaults(cacheName = "jasperCache")
public class JasperReportProducer {
public JasperReport getJasperReport(String fileName) throws PdfProducerException {
try {
ByteArrayInputStream bais = new ByteArrayInputStream(getJasperFileContent(fileName));
JasperReport report = (JasperReport) JRLoader.loadObject(bais);
return report;
} catch (JRException ex) {
Logger.getLogger(JasperReportProducer.class.getName()).log(Level.SEVERE, null, ex);
throw new PdfProducerException("Error Loading JasperReport File: " + fileName, ex);
} catch (IOException ex) {
Logger.getLogger(JasperReportProducer.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
@CacheResult
private byte[] getJasperFileContent(@CacheKey String fileName) throws IOException {
// FOR Test purpose!!! Remove later
System.out.println("==>Read jasperreport file");
Path path = Paths.get(fileName);
return Files.readAllBytes(path);
}
}
Usage:
@Inject
JasperReportProducer reportProducer;
reportAll = reportProducer.getJasperReport("all.jasper");
Comments: In the first version @CasheResult was JasperReport class but that caused unexpected problems (missing page numbers of reports, generated from cache). In this version @CasheResult is a simple byte[]. Works perfect.