我正在運行springboot服務器。 該服務器有一些web服務。 其中一個服務在收到請求時必須運行外部jar。實際上,服務器是計算引擎(罐子)和用戶之間的接口。 有代碼:從springboot服務器運行jar應用程序
public class Launcher extends Thread{
@Override
public void run() {
// TODO Auto-generated method stub
runJar(this.getJar(), this.getArgs());
}
private void runJar(String jar, String[] args){
try {
String[] s = new String[4+args.length];
s[0] = "nohup";
s[1] = "java";
s[2] = "-jar";
s[3] = jar;
for(int i = 0; i < args.length; i++){
s[i+4] = args[i];
}
Process p = Runtime.getRuntime().exec(s);
//Process exec = Runtime.getRuntime().exec(new String[] {"mkdir", "monTest"});
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("failed");
e.printStackTrace();
}
}
}
public class Memory {
private ArrayList<Integer> startedIds;
public ArrayList<Integer> getStartedIds() {
return startedIds;
}
public void setStartedIds(ArrayList<Integer> startedIds) {
this.startedIds = startedIds;
}
public Memory() {
this.startedIds = new ArrayList<>();
}
public Memory(ArrayList<Integer> arr) {
this.startedIds = arr;
}
public int start() {
int id = this.findAvailableId();
this.getStartedIds().add(id);
System.out.println("i'm going to start with a big command!+uhpop");
String[] args = {"arg1","arg2", "arg3", "&"};
Launcher launcher = new Launcher("myJar.jar", args);
launcher.start();
return id;
}
private int findAvailableId() {
int id = 0;
while(this.getStartedIds().contains(id)){
id++;
}
return id;
}
}
如果我的罐子做的很簡單的東西,如創建一個文件,它的作品不錯。但如果它更復雜,線程就停止工作,CPU將降至0%。這取決於我所要求的。對於某些任務問題發生之前爲他人如做
while(true);
它停了幾秒鐘後它可以運行30-35seconds。
我認爲這就像超時,但實際上它不是一個恆定的時間。也許像內存問題...?我試過在springboot服務器之外運行相同的代碼(在啓動Memory.start()的簡單java項目主體上,它運行良好,所以我認爲這是從我身邊引起的彈簧啓動誤解。知道如何使這個瓶子從springboot服務器獨立運行只是請告訴我。 謝謝。