2015-06-21 49 views
0

我有一個JAX-WS webservice,它接收一個字符串作爲參數,調用一個Perl腳本,並返回轉換爲大寫字符串。它運行在Tomcat 8上(Eclipse上的localhost)。從Java調用Perl腳本(Eclipse中的JAX-WS)

當我從控制檯輸入:

curl -X POST --data "mystring=HelloWorld" http://localhost:8080/MyServices/api/generatePath 

一切正常,除了Perl的電話。在調試器上,我看到該行被執行,但顯然沒有任何反應(甚至沒有發生錯誤)。如果我從控制檯運行perl /home/me/workspace/match.pl,它可以很好地工作。 match.pl文件的路徑是正確的。

此外,process.exitValue()回報2.

@Path("/") 
public class MyServices { 
    @POST 
    @Path("/generatePath") 
    @Produces(MediaType.APPLICATION_JSON) 

    public Response generatePathService(
      @FormParam("mystring") String myString) { 

     Process process = null; 

     try { 
      process = Runtime.getRuntime().exec("perl /home/me/workspace/match.pl --lang en"); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return Response.status(200).entity(myString.toUpperCase()).build(); 
    } 
} 

回答

1

我得到了類似的東西,前一段時間。對我來說,解決方案是「接受」程序的輸出。這樣的事情:

Process p = Runtime.getRuntime().exec(cmd); 
final InputStream is = p.getInputStream(); 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     try { 
      while (is.available() != 0) { 
       is.read(); 
      } 
     } catch (IOException ex) { 
     } 
    } 
}).start(); 

你也應該嘗試得到與p.getErrorStream()錯誤流。另外一種方法是改變你的perl程序,這樣就沒有什麼東西可以打印出來或者打印出來了。

或者你調用一個shell腳本,並將輸出重定向到dev/null的(像成才'blabla>的/ dev/null`。

+0

我剛剛試了一下,仍然無法正常工作。該應用程序,可直接到達在執行run()之前返回 – Arturo

+0

有沒有可能'追蹤'你的Perl腳本?我的意思是它運行?多遠?有沒有日誌文件或其他? – chris

+0

這很奇怪,我剛剛用match.pl替換了一個hello.pl這樣做: 'use strict; use warnings; open(my $ fh,'>','report.txt'); print $ fh「我的第一個報告由perl \ n產生」;關閉$ fh;打印「完成\ n」'。該文件report.txt永遠不會創建。但是,我會說它運行,因爲p.exitvalue()= 0,但是,如果我將名稱hello.pl更改爲hello2.pl(未執行)它迴歸ns 2 – Arturo