【问题标题】:Run jar application from a springboot server从 springboot 服务器运行 jar 应用程序
【发布时间】: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


    【解决方案1】:

    我终于找到了解决办法。我不得不放置一个

    p.waitFor();
    

    所以启动 jar 的线程不会停止。然后,jar 的输入和输出没有连接到启动线程的输入/输出,然后,我不得不创建另一个线程来监视 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");
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多