我正在编写一个需要定期加载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();
}
}
}
以下是我试图运行上述代码的不同方式
创建一个上面的类,并使用以下代码从另一个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();
}
但是当我尝试上面的代码时,只有代码最多为page = webClient.getPage(locationToPing);被执行并被阻止。屏幕上永远不会打印“开始5”。
我的应用程序需要定期从java调用jar并破坏之前的进程(如果有的话)。所以Option 4对我来说并没有好处,因为子进程很活跃,并且不容易破坏子进程。
选项3对我来说是理想的方式,但我完全无法理解为什么它会被阻止而不再继续?它与线程有关吗?我使用HTMLUnit的方式应该如何使用吗?
先谢谢