Hi Bernard,

As far as I know there is no build-in support in FOP to cancel the rendering. 
In Java, the only way to achieve it (except the deprecated stop()), is to get 
the thread that is executing it and call the interrupt() method. The problem is 
that there is no guarantee that the thread will interrupt it's execution and 
the behavior really depends on the code it is running. Typically if the thread 
is making calculations (and is not blocking on I/O requests or is not executing 
a method that throws InterruptedException, ....), then it will not respond to 
your interrupt. In this case, the only way to interrupt is if you execute code 
like 
if(Thread.interrupted()) // clears the interrupted status
  throw SomeException();

A good reading on cancellation and shutdown is Chapter 7 of "Java Concurrency 
in Practice" by  Brian Goetz, Tim Peierls, Joshua Bloch, Joseph Bowbeer, David 
Holmes, Doug Lea.

In practice, you typically can't change code in existing libraries. *IF* you 
find that FOP is not responding to the interrupt methods, then a workaround is 
to pass your own classes that will (1) check for the interrupted status or (2) 
check for your own flag and throw an exception, for example (2nd case):

public class InterruptAwareOutputStream extends BufferedOutputStream {
private boolean volatile shouldStop = false;
public void interruptProcessing() {
   shouldStop = true;
}

public void write(.....) {
    if(shouldStop)
       throw MyException();
   else
    super.write(....);
}
// other methods that need to be overwritten
}

For the XML to PDF example you pointed, you will also need to subclass like 
this the ContentHandler given to the "new SAXResult".

If the thread does not respond to the interrupt, it's always helpful to know 
what this is executing. I typically print the stacktrace with code like:

executingThread.interrupt();
                
StackTraceElement ste[] = executingThread.getStackTrace();
StringBuilder sb = new StringBuilder(LINE_SEP);
for (StackTraceElement s : ste) {
  String stacktrace = s.toString();
  sb.append(LINE_SEP).append("\t\t").append(stacktrace);
}

String stackTrace = sb.toString();              
logger.info("Interrupted ["+info.task.getId()+"]" + " executed by thread ["
                                + executingThread.getName() + "] with 
stacktrace:" + stackTrace);



Hope this helps,
Alexios Giotis


On Sep 18, 2011, at 4:42 PM, Bernard Giannetti wrote:

> Hi,
> 
> I'm wondering if it's possible to interrupt/cancel/abort a render once it has 
> been started.  I'm embedding FOP into a Java desktop application in a similar 
> way which is described here: 
> http://svn.apache.org/viewvc/xmlgraphics/fop/trunk/examples/embedding/java/embedding/ExampleXML2PDF.java?view=markup.
>   
> 
> I've looked at the API and nothing is immediately obvious.  I found this old 
> forum post 
> (http://www.mail-archive.com/fop-user@xml.apache.org/msg05146.html) which 
> didn't help.
> 
> I am running the rendering process in a thread but not sure how I'd go about 
> cleanly/gracefully aborting a render.
> 
> 
> Thanks,
> 
> Bernard.


---------------------------------------------------------------------
To unsubscribe, e-mail: fop-users-unsubscr...@xmlgraphics.apache.org
For additional commands, e-mail: fop-users-h...@xmlgraphics.apache.org

Reply via email to