Thanks Alex. Your example (different threads using Fop instances created
from the same FopFactory) is exactly the use case I was wondering whether
is was possible.


On Mon, Jul 1, 2013 at 3:35 PM, Alexios Giotis <alex.gio...@gmail.com>wrote:

> 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 <lmpmberna...@gmail.com> 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
> >
>
>

Reply via email to