2012-12-25 59 views
0

我用java進程運行一個外部命令。 該命令是帶有一些db2命令的.bat文件。 當我想使用進程waiffor()返回結果時,我什麼也得不到。該程序必須是阻止的。java exec()運行db2 import命令,waitfor()永不返回

Java代碼:

..... 

Runtime rt = Runtime.getRuntime(); 
Process p = null;  

String command = "db2cmd -c -w -i C:/import1.bat"; 

p = rt.exec(command); 
p.waitFor(); 

..... 

import1.bat:

@echo off 
db2 connect to text_DB user text using tesxt0114 

db2 IMPORT FROM "C:\MVCMSInputFiles\IIS20121224180129.csv" OF DEL METHOD P (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16) MESSAGES "C:\MVCMSInputFiles\20121224180129.log" INSERT INTO BLUEX.BIZ_MACHINE (MACHINE_SSERIALNO, MACHINE_STYPE, MACHINE_SPROJECTID, MACHINE_SCATEGORY, MACHINE_SNAME, MACHINE_SBRAND, MACHINE_SSPOT, MACHINE_SPRODUCEDATE, MACHINE_SSERVPERIOD, MACHINE_SENDDATE, MACHINE_SCONTRACTID, MACHINE_SSERVSTATUS, MACHINE_NSTATUS, MACHINE_SSCID, LOG_SLASTUSER, MACHINE_TSIMPORTTIME) 

db2 connect reset 


我也使用 p.getInputStream()處理 InputStream,但過程總是由第三命令是嵌段 (db2 import.....)

javacode:

Runtime rt = Runtime.getRuntime(); 
Process p = null; 

String command = "db2cmd -c -w -i C:/import1.bat"; 

p = rt.exec(command); 

BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 

while ((line = reader.readLine())!= null){    
    System.out.println(line);    
} 

reader.close(); 

while(true){     
    if (p.waitFor() == 0) break;    
} 

當我使用db2 export...db2 select * from ....更換第三命令。函數waitfor可以返回結果。該過程不能被阻止。

這太奇怪了。

+2

1)閱讀鏈接自['exec' tag Wiki](http://stackoverflow.com/tags/runtime.exec/info)的Java World文章並實施建議。如果它不能解決問題,它至少會提供更多關於失敗的信息。 2)使用'ProcessBuilder'而不是'Runtime.exec()'3)將'String command'分解爲'String []命令'。 4)爲什麼在該帖子的代碼中空白'隔行'?它使它運行得更快嗎? 5)..你的問題是什麼? –

回答

0

Mabye你可以這樣做:

Runtime rt = Runtime.getRuntime(); 
Process p = null;  

String command = "db2cmd -c -w -i C:/import1.bat"; 

p = rt.exec(command); 
p.getInputStream().close(); 
p.waitFor(); 

holp可以幫助你。

0

我得到了關於這個問題的答案。 原因是: 在p = rt.exec(command)之前,有沒有提交的連接對象。 所以這樣的代碼可以正確運行。

.... ... 
ConnectionFactory.commit(conn); 
p = rt.exec(command); 
... ....