【发布时间】:2017-11-14 05:22:25
【问题描述】:
我正在运行一个 springboot 服务器。 该服务器有一些网络服务。 其中一项服务在收到请求时必须运行外部 jar。实际上,服务器是计算引擎(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 项目 main 上运行良好。所以我认为这是我对 spring boot 的误解。如果有人知道请告诉我如何让这个 jar 独立于 springboot 服务器运行。 谢谢你。
【问题讨论】:
标签: java spring-boot jar