我正在尝试将n个XML转换为n个线程中的n个PDF。为此,我使用ExecutorService并将线程池大小限制为例如10:
File[] files = getDocuments(sourceFolder);
ExecutorService executorService = Executors.newFixedThreadPool(10);
List<Future<Integer>> threads = new ArrayList<>();
for (File source : files) {
if (logger.isDebugEnabled()) {
logger.debug("Creating thread for " + source.getName());
}
Callable<Integer> callable = new XMLToPDFCallable(source, FileNameUtils.getPdfTarget(source, targetFolder));
Future<Integer> future = executorService.submit(callable);
threads.add(future);
}
在我进行第一次测试后,我发现只有一个XML被成功转换,我也看到XMLToPDFCallable()总是使用相同的参数:
TransformerExecutorService.startExecution - 为 test_bold.xml 创建线程 TransformerExecutorService.startExecution - 为 test_list_attach.xml创建线程 TransformerExecutorService.startExecution - 为 test_underlined.xml 创建线程 XMLToPDFCallable.call XMLToPDFCallable(文件 test_bold.xml ,文件test_bold.pdf)
XMLToPDFCallable.call XMLToPDFCallable(文件 test_underlined.xml ,文件test_underlined.pdf) XMLToPDFCallable.call XMLToPDFCallable(文件 test_underlined.xml ,文件test_underlined.pdf) XMLToPdf.transform - test_underlined.xmlXMLToPdf.transform - test_underlined.xml
XMLToPdf.transform - test_underlined.xml
XMLParser的。 - XMLParser(文件 test_underlined.xml )
XMLParser的。 - XMLParser(文件 test_underlined.xml )
XMLParser的。 - XMLParser(文件 test_underlined.xml )
FutureTask @ 4c90265b的结果:1 FutureTask的结果@ bc647a2:1 FutureTask的结果@ 688e2b8:1
XMLToPDFCallable类:
public class KMToPDFCallable implements Callable<Integer> {
...
public XMLToPDFCallable(File source, File target) {
this.source = source;
this.target = target;
}
@Override
public Integer call() throws Exception {
logger.debug("call() of Instance XMLToPDFCallable(File " + source.getName() + ", File " + target.getName() + ") ");
xmlToPdf = new XMLToPdf();
if(xmlToPdf.transform(source, target)) {
status = STATUS_FINISHED;
} else {
status = STATUS_ABORTED;
}
kmToPdf = null;
return status;
}
XMLToPDF类(简单类):
public boolean transform(File src, File target) {
...
// the XML parser
logger.debug(src.getName());
xmlParser = new XMLParser(src);
...
XMLParser类(也是简单类):
public XMLParser(File xml) {
logger.debug("XMLParser(File " + xml.getName() + ")");
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder = factory.newDocumentBuilder();
document = builder.parse(xml);
builder.reset();
} catch (ParserConfigurationException e) {
那么为什么XMLToPDFCallable.call总是使用相同的文件而不是我在构造函数中传递的文件?