我正在运行一个springboot服务器。 这个服务器有一些web服务。 其中一个服务必须在收到请求时运行外部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服务器之外运行相同的代码(在一个简单的java项目主服务器上启动Memory.start()并且它运行良好。所以我认为这是一个春天启动误解了我。如果有人知道如何使这个jar独立于springboot服务器运行请告诉我。 谢谢。
答案 0 :(得分:0)
我终于找到了解决方案。我不得不放一个
p.waitFor();
所以启动jar的线程不会停止。然后,jar的输入和输出没有连接到lauching线程的输入/输出,然后,我必须创建另一个线程来监视jar的输出(它实际上在主线程中打印它)。我在这里找到了这些信息:http://labs.excilys.com/2012/06/26/runtime-exec-pour-les-nuls-et-processbuilder/ 我仍然不明白为什么它在springboot服务器之外工作,实际上它不应该运行...
如果有人感兴趣,这是我的代码。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
class AfficheurFlux implements Runnable {
private final InputStream inputStream;
AfficheurFlux(InputStream inputStream) {
this.inputStream = inputStream;
}
private BufferedReader getBufferedReader(InputStream is) {
return new BufferedReader(new InputStreamReader(is));
}
@Override
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String ligne = "";
try {
while ((ligne = br.readLine()) != null) {
System.out.println(ligne);
}
} catch (IOException e) {
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 startJar() {
int id = this.findAvailableId();
this.getStartedIds().add(id);
System.out.println("i'm going to start with a big command!");
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;
}
public class Launcher extends Thread{
private String jar;
private String[] args;
public AntLauncher(String jar, String[] args) {
super();
this.jar = jar;
this.args = args;
}
@Override
public void run() {
runJar(this.getJar(), this.getArgs());
}
private void runJar(String jar, String[] args){
try {
String[] s = new String[3+args.length];
s[0] = "java";
s[1] = "-jar";
s[2] = jar;
for(int i = 0; i < args.length; i++){
s[i+3] = args[i];
}
Process p = Runtime.getRuntime().exec(s);
AfficheurFlux fluxSortie = new AfficheurFlux(p.getInputStream());
AfficheurFlux fluxErreur = new AfficheurFlux(p.getErrorStream());
new Thread(fluxSortie).start();
new Thread(fluxErreur).start();
p.waitFor();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Fin du programme");
}
}
}