从Runtime.exec()调用jar时,阻止HTMLUnit webClient.getPage(locationToPing)

时间:2011-06-04 09:19:26

标签: htmlunit runtime.exec

我正在编写一个需要定期加载jar的应用程序。 Jar使用HTMLUnit获取网站的内容。当这个jar从commond提示运行时,它按预期运行。但是当我使用运行时使用java代码运行它时,它会在这个地方阻塞,page = webClient.getPage(locationToPing); 并没有继续进行。

Jar只包含一个java类,如下所示,

package tempproj2;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Fetcher {

String locationToPing;
volatile WebClient webClient = new WebClient(BrowserVersion.FIREFOX_3_6);
HtmlPage page ;
public static final long SLEEP_TIME_IF_CONNECTION_WAS_REFUSED=10000; //SECS
public long connectionRefusedTime=0;

private static Fetcher theOnlyInstanceOfThisClass=new Fetcher();

public static Fetcher getInstance(){
    return theOnlyInstanceOfThisClass;
}
private Fetcher(){
    init();
    fetchUsingGet();
}
private void init(){
    locationToPing="http://www.mail.yahoo.com";
}

private  void fetchUsingGet(){
    try {
        System.out.println("-----------Start  1 --------------")            ;
        webClient.setUseInsecureSSL(true);
        webClient.setThrowExceptionOnScriptError(false);
        System.out.println("-----------Start  2 --------------")            ;
        webClient.setJavaScriptEnabled(true);
        System.out.println("-----------Start  3 --------------")            ;
        webClient.setTimeout(5000);  //30 secs - its int n not long be careful abt it.
        System.out.println("-----------Start  4 --------------locationToPing="+locationToPing)            ;
        page= webClient.getPage(locationToPing);
        System.out.println("-----------Start  5 --------------"+page.asXml())            ;
    } catch (Exception ex) {
        System.out.println("-----------IC Fetecher     Error here --------------"+ex.getMessage())            ;
        connectionRefusedTime=System.currentTimeMillis();
       ex.printStackTrace();
    }
}

private void reload(){

    if(page==null){
        fetchUsingGet();
        return;
    }
    try {

        page=(HtmlPage)page.refresh();
    } catch (java.net.SocketTimeoutException ex) {
        fetchUsingGet();
        ex.printStackTrace();
    }catch(IOException ex){
        ex.printStackTrace();
    }
}


public static void main(String ar[]){
    Fetcher fetcher=new Fetcher();
    while(true){
        try {
            Thread.sleep(4*1000);
        } catch (InterruptedException ex) {
            Logger.getLogger(Fetcher.class.getName()).log(Level.SEVERE, null, ex);
        }
        fetcher.reload();

    }


}

}

以下是我试图运行上述代码的不同方式

  1. 按原样运行课程 - 运行正常。
  2. 制作上述类的Jar并使用java -jar命令提示符运行命令 - 运行正常。
  3. 创建一个上面的类,并使用以下代码从另一个java类运行它,

    try {
        String execCmd="java -jar "+downloadApplicationJarLocation.getAbsolutePath();
        Process pr=Runtime.getRuntime().exec(execCmd) ;
    
            InputStreamReader is = new InputStreamReader(pr.getInputStream());
            BufferedReader br = new BufferedReader(is);
            String line = null;
            String processMessage="";
            while ((line = br.readLine()) != null) {
                System.err.println("Line 1 "+line)    ;            
                processMessage+=line;
            }
            System.out.println("Finished ");
            is.close();
            br.close();
    
    
    } catch (IOException ex) {
        ex.printStackTrace();
    }
    
  4. 但是当我尝试上面的代码时,只有代码最多为page = webClient.getPage(locationToPing);被执行并被阻止。屏幕上永远不会打印“开始5”。

    1. 我修改了上面的代码,而不是直接调用Runtime.exec()中的e Java -jar命令,我把它放在一个批处理文件中并调用这个批处理文件。 进程pr = Runtime.getRuntime()。exec(batchFileLocation); 现在它按预期执行并且没有阻止代码。还在屏幕上打印“Start 5”。
    2. 我的应用程序需要定期从java调用jar并破坏之前的进程(如果有的话)。所以Option 4对我来说并没有好处,因为子进程很活跃,并且不容易破坏子进程。

      选项3对我来说是理想的方式,但我完全无法理解为什么它会被阻止而不再继续?它与线程有关吗?我使用HTMLUnit的方式应该如何使用吗?

      先谢谢

0 个答案:

没有答案