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.