Hi Luis,
It is definitely possible to have different threads using Fop instances created
from the same FopFactory. In fact, for me this is the typical usage. This is
like replacing
> foreach (Doc doc : listOfDocs) {
> File fo = doc.getFOFile();
> File pdf = doc.getPDFFile();
> generateOutput(fo, pdf, fopFactory);
with
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, ...);
for (Doc doc : listOfDocs) {
executor.submit(new Runnable() {
File fo = doc.getFOFile();
File pdf = doc.getPDFFile();
generateOutput(fo, pdf, fopFactory);
}
}
It is used to reduce the time required to generate thousands or millions of
documents.
Fop instances can also be generated from different FopFactory instances. This
is a workaround I used in the past to avoid some FOP concurrency issues. The
drawback is increased memory usage and warm-up time as FOP caches are
referenced from a FopFactory instance.
Alex Giotis
On 1 Jul 2013, at 15:14, Luis Bernardo <[email protected]> wrote:
>
> Hello,
>
> I am investigating the possible caching of layout elements and as part of the
> investigation I realized that I need to understand how fop instances are
> managed in real life situations. In particular, I need to know if it is
> possible to have two concurrent fop instances created from the same fop
> factory.
>
> This is a typical use case I am familiar with:
> FopFactoryBuilder builder = new FopConfParser(new
> File(confFile)).getFopFactoryBuilder();
> FopFactory fopFactory = builder.build();
> foreach (Doc doc : listOfDocs) {
> File fo = doc.getFOFile();
> File pdf = doc.getPDFFile();
> generateOutput(fo, pdf, fopFactory);
> }
>
> where:
>
> public static void generateOutput(File fo, File pdf, FopFactory
> fopFactory) throws IOException, FOPException,
> TransformerException {
> OutputStream out = null;
> try {
> FOUserAgent foUserAgent = fopFactory.newFOUserAgent();
> out = new FileOutputStream(pdf);
> out = new BufferedOutputStream(out);
> Fop fop = fopFactory.newFop(mime, foUserAgent, out);
> TransformerFactory factory = TransformerFactory.newInstance();
> Transformer transformer = factory.newTransformer();
> Source src = new StreamSource(fo);
> Result res = new SAXResult(fop.getDefaultHandler());
> transformer.transform(src, res);
> } finally {
> out.close();
> }
> }
>
> In this case, even though a fop factory can create many fop instances we
> cannot have more than one in use at at given time.
>
> Is anyone using a different approach where concurrent fop instances are
> possible?
>
> Thanks,
> Luis
>