从springboot服务器运行jar应用程序

时间:2017-06-12 16:32:09

标签: java spring-boot jar

我正在运行一个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服务器运行请告诉我。 谢谢。

1 个答案:

答案 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");
        }
    }
}