リモートの Windows マシンで Java から C++ コードを実行しようとしています。リモート部分に対処するために、Runtime.exec() を使用して実際のコマンドが実行される Web サービスを作成しました。C++ exe は、Java コードから直接呼び出されていません。最終的にexeを呼び出すバッチファイルがあります。
問題は、Java プロセスと C++ プロセスの両方がハングすることです。サーバー側の Java コードは、出力ストリームとエラー ストリームを処理します。また、C++ コードは Windows 上のファイルにすべてを記録しています。奇妙なことに、WS 呼び出しを削除し、Java コードをサーバー側でスタンドアロン Java プログラムとして実行すると、成功します。Javaコードは次のとおりです。
public class RunCPlusPlusExecutable {
public int runExecutable() {
int exitValue = 0;
try {
Process p = null;
Runtime rt = Runtime.getRuntime();
System.out.println("About to execute" + this + rt);
p = rt.exec("c:/temp/execcplusplus.bat");
System.out.println("Process HashCode=" + p.hashCode());
StreamProcessor errorHandler = new StreamProcessor(p.getErrorStream(), "Error");
StreamProcessor outputHandler = new StreamProcessor(p.getInputStream(), "Output");
errorHandler.start();
outputHandler.start();
exitValue = p.waitFor();
System.out.println("Exit value : " + exitValue);
if (exitValue == 0)
System.out.println("SUCCESS");
else
System.out.println("FAILURE");
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
}
return exitValue;
}
class StreamProcessor extends Thread {
private InputStream is = null;
private String type = null;
private InputStreamReader isr = null;
private BufferedReader br = null;
private FileWriter writer = null;
private BufferedWriter out = null;
StreamProcessor(InputStream is, String type) {
this.is = is;
this.type = type;
}
public void run() {
try {
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
writer = new FileWriter("*******path to log file********");
out = new BufferedWriter(writer);
String line = null;
while ((line = br.readLine()) != null) {
Date date = new Date();
out.write("[" + type + "]: " + date + " : " + line);
out.newLine();
}
writer.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (br != null)
br.close();
if (isr != null)
isr.close();
if (out != null)
out.close();
if (writer != null)
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
問題の原因とデバッグ方法について何か考えはありますか? C++ コードをデバッグできないことに注意してください。
ありがとう
更新 1: 詳細は次のとおりです... WS サーバーは、管理者ユーザーによって実行されています。そして、他のユーザーからスタンドアロンの Java プログラムを実行しています。* WS 呼び出しからの実行中に、C++ 実行可能ファイルが参照メモリ エラーを出しているようです。[OK] ボタンと [キャンセル] ボタンでエラーを引用するポップアップがあります。*
更新 2: WS が展開されている tomcat サーバーは、Windows NT サービスとして実行されています。それがエラーの原因でしょうか?はいの場合、これを解決するにはどうすればよいですか?