Use Java to execute the bat command. If the bat operation takes too long, it may cause blocking problems, and bat will not be executed until the server is shut down.
like:
Copy the code code as follows:
Runtime r=Runtime.getRuntime();
Process p=null;
try{
String path = "D:/test.bat";
p = r.exec("cmd.exe /c "+path);
p.waitFor();
}catch(Exception e){
System.out.println("Run error:"+e.getMessage());
e.printStackTrace();
}
Generally, Java's exec does not help you deal with thread blocking problems, and needs to be handled manually.
After processing:
Copy the code code as follows:
Runtime r=Runtime.getRuntime();
Process p=null;
try{
String path = "D:/test.bat";
p = r.exec("cmd.exe /c "+path);
StreamGobbler errorGobbler = new StreamGobbler(p.getErrorStream(), "ERROR");
errorGobbler.start();
StreamGobbler outGobbler = new StreamGobbler(p.getInputStream(), "STDOUT");
outGobbler.start();
p.waitFor();
}catch(Exception e){
System.out.println("Run error:"+e.getMessage());
e.printStackTrace();
}
The StreamGobbler class is as follows:
Copy the code code as follows:
package com.test.tool;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
* Used to handle the error stream and output stream generated by Runtime.getRuntime().exec
*/
public class StreamGobbler extends Thread {
InputStream is;
String type;
OutputStream os;
StreamGobbler(InputStream is, String type) {
this(is, type, null);
}
StreamGobbler(InputStream is, String type, OutputStream redirect) {
this.is = is;
this.type = type;
this.os = redirect;
}
public void run() {
InputStreamReader isr = null;
BufferedReader br = null;
PrintWriter pw = null;
try {
if (os != null)
pw = new PrintWriter(os);
isr = new InputStreamReader(is);
br = new BufferedReader(isr);
String line=null;
while ( (line = br.readLine()) != null) {
if (pw != null)
pw.println(line);
System.out.println(type + ">" + line);
}
if (pw != null)
pw.flush();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally{
try {
pw.close();
br.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
Run bat and it will not be blocked.