2017-06-12 124 views
1

我正在运行springboot服务器。 该服务器有一些web服务。 其中一个服务在收到请求时必须运行外部jar。实际上,服务器是计算引擎(罐子)和用户之间的接口。 有代码:从springboot服务器运行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; 
} 

} 

如果我的罐子做的很简单的东西,如创建一个文件,它的作品不错。但如果它更复杂,线程就停止工作,CPU将降至0%。这取决于我所要求的。对于某些任务问题发生之前为他人如做

while(true); 

它停了几秒钟后它可以运行30-35seconds。

我认为这就像超时,但实际上它不是一个恒定的时间。也许像内存问题...?我试过在springboot服务器之外运行相同的代码(在启动Memory.start()的简单java项目主体上,它运行良好,所以我认为这是从我身边引起的弹簧启动误解。知道如何使这个瓶子从springboot服务器独立运行只是请告诉我。 谢谢。

回答

0

我终于找到了解决办法,我只好把一个

p.waitFor(); 

因此线程启动罐子会不停止,然后,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"); 
     } 
    } 
} 
相关问题