Hi,


What about reusing the fopfactory, 1 per thread.



Thanks



From: 孤王 <1289495...@qq.com.INVALID>
Sent: 04 June 2024 14:49
To: fop-users <fop-users@xmlgraphics.apache.org>
Cc: 18224494266 <18224494...@163.com>
Subject: Fop batch generate report performance



Dear Fop Docters,



I am a student of Fop. May I ask some question for run the batch reports by
Fop? Our company using the Fop to generate TIFF file. found the TIFF file
cannot load font by lazy font. So, it will load all of the config folder
fonts.

<renderer mime="image/tiff">

  <directory recursive = "true">/tmp/fonts</directory>

  <compression>CCITT T.6</compression>

  <endianness>LITTLE_ENDIAN</endianness>

</renderer>



As our company all fonts more than 200M. So, when run the batch data(which
records more 10000 each request). it mean one batch request will loop 10k
times to create 10K Fop objects( fopFactory.newFop(...)). Each record of
the batch need to load the font again. it lead to the generate is too slow.



Could you give me some advise for new Fop object Repeatedly loading fonts
for each record of one batch(one batch has 10k records need to loop).
Our found the Repeatedly loading fonts of Fop core code. As attachment
picture "Fop custom load font code.PNG".
Our service code example as below.

@Override
public boolean fopGen(RequestData requestData, Templates templates) {
    // one batch loop more than 10000 records.
    requestData.getData().forEach(singleData ->{
        String xmlData = convertJson2Xml(singleData);
        generateFopFactory(xmlData,templates);
    });
    return true;
}
private void generateFopFactory(String xmlData, Templates templates){
    FopFactory fopFactory = createFopFactory();
    try(ByteArrayInputStream inputStream = new ByteArrayInputStream(xmlData.
getBytes());
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream()){
        Source src;
        src = new StreamSource(inputStream);
        Fop fop =
fopFactory.newFop(MimeConstants.MIME_TIFF,fopFactory.newFOUserAgent(),output
Stream);
        Transformer transformer = templates.newTransformer();
        final List<String> errList = new ArrayList<>();
        transformer.setErrorListener(new FopErrorListener());
        Result res = new SAXResult(fop.getDefaultHandler());
        transformer.transform(src,res);
        convert2File(outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    } catch (FOPException e) {
        e.printStackTrace();
    } catch (TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (TransformerException e) {
        e.printStackTrace();
    }
}

Reply via email to