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/[email protected]/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: [email protected]
For additional commands, e-mail: [email protected]