gpt4 book ai didi

java - 从 Spring Boot 服务器运行 jar 应用程序

转载 作者:太空宇宙 更新时间:2023-11-04 11:24:39 25 4
gpt4 key购买 nike

我正在运行一个 springboot 服务器。该服务器有一些网络服务。其中一项服务在收到请求时必须运行外部 jar。实际上,服务器是计算引擎(jar)和用户之间的接口(interface)。有代码:

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 服务器运行,请告诉我。谢谢。

最佳答案

我终于找到了解决办法。我必须放置一个

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

关于java - 从 Spring Boot 服务器运行 jar 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44504419/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com