私はspringbootサーバーを実行しています。 このサーバーにはいくつかのWebサービスがあります。 これらのサービスの1つは、要求を受け取ったときに外部jarを実行する必要があります。実際には、サーバーは計算エンジン(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;
}
}
私のjarファイルは、このようなファイルを作成するなど、本当に簡単な何かをする場合、それは素敵な作品。しかし、それがより複雑な場合、スレッドは動作を停止し、CPUは0%に低下します。それは私が尋ねるものに依存します。いくつかのタスクでは、実行中に問題が発生する前に30〜35秒かかることがあります。
while(true);
これは数秒後に停止しました。
タイムアウトのようなものだと思っていましたが、実際は一定の時間ではありません。メモリ問題のようなものかもしれない...?
私はspringbootサーバー(Memory.start()を起動する単純なJavaプロジェクトのメインフレーム)で同じコードを実行しようとしましたが、うまくいきます。このjarは私をしてください教えてspringbootサーバーから独立して実行させる方法を知っている。 ありがとう。