Launching wkhtmltopdf from Runtime.getRuntime().exec(): never terminates?

前端 未结 4 2053
清歌不尽
清歌不尽 2021-01-12 06:20

I\'m launching wkhtmltopdf from within my Java app (part of a Tomcat server, running in debug mode within Eclipse Helios on Win7 64-bit): I\'d like to wait for it to comple

4条回答
  •  被撕碎了的回忆
    2021-01-12 06:47

        final Semaphore semaphore = new Semaphore(numOfThreads);
        final String whktmlExe = tmpwhktmlExePath;
        int doccount = 0;
        try{
            File fileObject = new File(inputDir);
            for(final File f : fileObject.listFiles()) {
    
                if(f.getAbsolutePath().endsWith(".html")) {
                    doccount ++;
                    if(doccount >500 ) {
                        LOG.info(" done with conversion of 1000 docs exiting ");
                        break;
                    }
                    System.out.println(" inside for before "+semaphore.availablePermits());
                    semaphore.acquire();
                    System.out.println(" inside for after "+semaphore.availablePermits() + " ---" +f.getName());
                    new java.lang.Thread() {
                        public void run() {
                            try {
                                String F_ =  f.getName().replaceAll(".html", ".pdf") ;
                                ProcessBuilder pb = new ProcessBuilder(whktmlExe , f.getAbsolutePath(), outPutDir + F_ .replaceAll(" ", "_") );//"wkhtmltopdf.exe", htmlFilePath, pdfFilePath);
                                pb.redirectErrorStream(true);
                                Process process = pb.start();
                                BufferedReader errStreamReader = new BufferedReader(new  InputStreamReader(process.getInputStream()));  
                                String line = errStreamReader.readLine(); 
                                while(line != null) 
                                { 
                                    System.err.println(line); //or whatever else
                                    line = errStreamReader.readLine(); 
                                }
    
                                System.out.println("after completion for ");
                            } catch (Exception e) {
                                e.printStackTrace();
                            }finally {
                                System.out.println(" in finally releasing ");
                            semaphore.release();
                            }
                      }
                    }.start();
                }
            }
        }catch (Exception ex) {
            LOG.error(" *** Error in pdf generation *** ", ex);
        }
    
        while (semaphore.availablePermits() < numOfThreads) {//till all threads finish 
            LOG.info( " Waiting for all threads to exit "+ semaphore.availablePermits() + " --- " +( numOfThreads - semaphore.availablePermits()));
            java.lang.Thread.sleep(10000);
        }
    

提交回复
热议问题